26 删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
示例 1:
输入:nums = [1,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]
解题思路:利用双指针, fast 和 slow 分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。
思考什么情况下才需要填新元素,当nums[fast]!=nums[fast-1]时,把fast值赋给slow。
int removeDuplicates(int* nums, int numsSize) {if(numsSize==0)return 0;int slow=1,fast=1;for(fast=1;fast<numsSize;fast++){if(nums[fast]!=nums[fast-1]){nums[slow]=nums[fast];slow++;}}return slow;
}
283 移动0
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
解题思路:双指针
void moveZeroes(int* nums, int numsSize) {int slow=0,fast=0;for(fast=0;fast<numsSize;fast++){if(nums[fast]!=0){nums[slow]=nums[fast];slow++;}}for(int i=slow;i<numsSize;i++){nums[i]=0;}
}
c交换函数swap
void swap(int *a,int *b){
int t=*a;
*a=*b,*b=t;
}
void swap(int *a, int *b) {int t = *a;*a = *b;*b = t;
}
void moveZeroes(int* nums, int numsSize) {int slow=0,fast=0;for(fast=0;fast<numsSize;fast++){if(nums[fast]!=0){swap(nums+slow,nums+fast);slow++;}}
}