26. 删除有序数组中的重复项
自己第一次写出来的通过的代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int slow = 0, fast = 0;
int n = nums.size();
while (fast < n)
{
while (fast < n && nums[fast] == nums[slow]) fast ++ ;
slow ++ ;
if (slow < n && fast < n && nums[slow] != nums[fast]) nums[slow] = nums[fast];
}
return slow;
}
};
特别要注意数组的越界情况,涉及到nums[fast]
和nums[slow]
的使用时,一定要保证此时的fast
和slow
都在数组的范围内,没有越界。
不过看了下官方题解
这个官方题解和我写法不同,它的写法和思路更优,数组越界问题可以避免。
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] != nums[fast−1]
,说明 nums[fast]
和之前的元素都不同,因此将 nums[fast]
的值复制到 nums[slow]
,然后将 slow
的值加 1,即指向下一个位置。
自我感觉这句话是建立在数组是非单调递增的这一条件上,如果nums[fast] != nums[fast−1]
,那么nums[fast]
一定大于 nums[fast−1]
及它左边的数,自然nums[fast]
和之前的元素都不相等。