一、题目描述与要求
二、解题思路
-
首先,我们判断输入数组 nums 的长度 n。如果数组为空,直接返回 0,因为没有重复元素可删除。
-
接下来,我们初始化快指针 fast 和慢指针 slow,都指向数组的第二个元素(索引为 1)。同时,我们也可以将数组中第一个元素直接视为不重复的元素,因为数组至少保留一个元素。
-
使用 while 循环遍历整个数组,循环条件是快指针 fast 小于数组长度 n。
-
在每次循环中,我们通过比较快指针指向的元素 nums[fast] 是否等于前一个元素 nums[fast-1] 来判断是否有重复。如果两个元素不相等,则说明当前元素是一个新的不重复元素,可以将其复制到慢指针指向的位置 nums[slow],并将慢指针 slow 向前移动一位(++slow)。
-
不论是否有重复元素,快指针都要继续向前移动一位(++fast)。
-
当循环结束后,所有的不重复元素已经被复制到了前面的位置,此时慢指针 slow 的值即为去重后的数组长度。
-
返回慢指针 slow 的值作为结果。
这种解决方法的时间复杂度是 O(n),其中 n 是数组的长度。快慢指针的方法适用于有序数组中去除重复元素的问题。
三、具体代码(C++)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
};
这段代码是一个删除有序数组中的重复项问题的函数。函数的输入参数是一个整数数组 nums。函数的目标是移除数组中的重复元素,并返回去重后的数组长度。
代码中使用了快慢指针的方法来解决该问题。初始化时,快指针 fast 和慢指针 slow 都指向数组的第二个元素(索引为 1)。通过遍历数组,当快指针指向的元素与前一个元素不相同时,将该元素复制到慢指针指向的位置,并使慢指针向前移动一位。最后返回慢指针的值作为去重后的数组长度。
需要注意的是,该函数假设输入的数组已经按非递减顺序排序。