链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
思路一:
遍历数组,如果当前元素(第i个元素)和第i+1个元素相同,移去第i+1个元素。
缺点: vector删除元素操作效率低,性能差。
class Solution {
int removeDuplicates(vector<int>& nums) {
for (vector<int>::iterator it = nums.begin(); it < nums.end() - 1;) {
if (*it == *(it + 1)) {
nums.erase(it + 1);
} else {
++it
}
}
return nums.size();
}
};
思路二:
双指针法: 放置两个指针i和 j,其中i是慢指针,而j是快指针。只要 nums[i] == nums[j],也就是j是i的重复项,就增加j以跳过重复项。当num[i] != nums[j]时,慢指针就向前走一步,然后将非重复值赋值给i指针指向值。
时间复杂度: O(n)
class Solution {
int removeDuplicates(vector<int>& nums) {
int i = 0;
for (int j = 1; j < nums.size(); j++) {
if (nums[j] != nums[i]) {
++i;
nums[i] = nums[j];
}
}
return i+1;
}
};