题目:给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
双指针
相当于只有nums[slow]在跑,fast作为原数组的探路者,fast一直在变,为nums[slow]赋值。数字一直在变,所以只需比较前后一个元素即可。
1:首先定义了两个指针 fast 和 slow,初始值都为 1,表示数组的第二个元素。
2:使用 while 循环遍历数组,fast 指针从第二个元素开始向后移动。
3:如果 nums[fast] 不等于 nums[fast-1],即当前元素不等于前一个元素,将当前元素的值赋给 nums[slow],然后 slow 指针向后移动一位。
4:遍历结束后,slow 指针的位置即为去除重复元素后的数组长度。
class Solution {
public int removeDuplicates(int[] nums) {
int fast=1,slow=1,n=nums.length;
while(fast<n){
if(nums[fast]!=nums[fast-1]){
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
另一种代码(思路同上种):用index作为标志位。
class Solution {
public int removeDuplicates(int[] nums) {
int index=0,n=nums.length;
for(int i=1;i<n;i++){
if(nums[i]!=nums[index]){
nums[++index]=nums[i];
}
}
return index+1;
}
}