26. 删除有序数组中的重复项
解题思路
-
定义指针:初始化两个指针slow和fast,其中slow指针代表处理过的不重复元素的最后一位,fast指针用于探索数组寻找下一个不重复的元素。
-
遍历数组:fast指针从数组的第二个元素开始向前移动,因为第一个元素默认是不重复的,所以slow从0开始,fast从1开始。
-
比较和移动:在遍历过程中,比较slow和fast指针指向的元素:
-
如果两个指针指向的元素相同,这意味着fast指向的元素是重复的,因此fast指针继续向前移动,寻找下一个可能的不重复元素。
-
如果两个指针指向的元素不同,这意味着fast指向的元素是新的不重复元素。首先将slow指针向前移动一个位置(因为要覆盖掉前面的重复元素),然后将fast指向的元素复制到slow指向的位置,最后fast指向的位置继续向前探索。
返回结果:当fast指针遍历完整个数组后,所有不重复的元素都已经被移到了数组的前端,slow指针的位置加1(因为指针位置是从0开始的)即为不重复元素的数量。
class Solution {
public int removeDuplicates(int[] nums) {
// 双指针解法
int n = nums.length;
if(n == 0){
return 0;
}
int slow = 0;
int fast = 1;
// 快指针走在前面 然后慢指针在后面 找到一个不重复的元素之后
// 将不重复的元素填充到slow位置
while(fast < n){
if(nums[fast] != nums[slow]){
slow++;
nums[slow] = nums[fast];
}
fast++;
}
return slow + 1;
}
}