力扣算法小结
第一题:移动零
leetcode地址:https://leetcode-cn.com/problems/move-zeroes/
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
相关标签 数组+双指针
方法:
方法一:双指针,将非零的元素移动到数组的前面,后面根据数组的长度赋值为0即可
方法二:双指针,将零和非零的元素交换,非零的逐渐靠前,零逐渐靠后
思路:
方法一:
设置两个指针一个为快指针fast,一个为慢指针slow,通过一个while循环遍历数组,然后if语句判断,如果数组元素nums[fast]等于0就fast指针+1去判断下一个元素,如果数组元素nums[fast]不等于0则将该元素赋值给下标变量为为slow的数组中去即nums[slow++],当把数组中的非零元素都放到nums[slow++]之后,最后再把数组剩余的下标元素直接赋值为0即可。
方法二:
设置两个指针一个为快指针fast,一个为慢指针slow,通过一个for循环遍历数组,然后if语句判断,如果数组元素nums[fast]不等于0,则将nums[fast]与nums[slow]进行交换,然后slow++,意思就是说当nums[fast]不等于0,就将slow+1然后在交换两个数组的值,这样就可以将非零元素逐渐前移,零元素逐渐后移。
方法一代码:
class Solution {
public void moveZeroes(int[] nums) {
//方法一
int slow=0; //快指针
int fast=0; //慢指针
while(fast<nums.length){
if(nums[fast]==0){ //数组元素等于0就下标+1
fast++;
}else { //数组元素不等于=就将元素复制到另一个数组
nums[slow++]=nums[fast++];
}
}
for(;slow<nums.length;slow++){ //将数组中剩余的位置赋值为0
nums[slow]=0;
}
}
}
方法二代码:
class Solution {
public void moveZeroes(int[] nums) {
//方法二
int slow=0; //慢指针
int temp=0;
for(int fast=0;fast<nums.length;fast++){ //快指针
if(nums[fast]!=0){ //数组元素不为0,交换元素,慢指针下标+1
temp=nums[slow];
nums[slow]=nums[fast];
nums[fast]=temp;
slow++;
}
}
}
}
第二题:删除排序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
示例:
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
提示:
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列
相关标签 数组 双指针
方法:
方法一:双指针,如果快指针数组中的值不存在于慢指针数组中,就将该值加入到慢指针数组中去
思路:
首先遍历数组,然后if语句判断快指针对应的值是否与慢指针对应的值相等,如果相等则fast+1,如果不等就将nums[fast]的值加入到nums[++slow]里面去,注意:这里是++slow而不是slow++,因为初始化的slow=0,所以后面需要先让慢指针slow+1才能放值进去,最后返回slow+1即可,因为+1是slow最开始等于0,这里最后需要返回的是数组的实际长度.
代码:
方法一:
class Solution {
public int removeDuplicates(int[] nums) {
int slow=0; //慢指针
for(int fast=1;fast<nums.length;fast++){ //快指针
if(nums[fast]!=nums[slow]){ //如果快指针数组中的值不存在于慢指针数组中,则将该值加入到慢指针数组中去
nums[++slow]=nums[fast];
}
}
return slow+1; //返回慢指针数组中的实际长度
}
}