题目描述:
题解:
法一:暴力法
数据从前往后扫描,若下一个元素的值与当前元素的值相等,将下一个元素之后的所有元素整体向前挪一位,否则取下一个元素为当前元素。
代码实现:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) return 0;
int index = 0, len = nums.size();
while (index < len - 1){
if (nums[index] == nums[index + 1]){
for (int j = index + 1; j < len - 1; j++)
nums[j] = nums[j + 1];
len--;
} else {
index++;
}
}
return len;
}
};
时间复杂度:(O(n^2))
空间复杂度:(O(1))
法二:双下标
在法一中,每次遇到重复元素便将之后的元素整体向前移动,正是这个操作导致了时间复杂度的提高。所以,进一步降低时间复杂度的关键在于在遇到重复元素时避免元素的整体移动。其实,可以使用两个指针,一个(指针A)指向当前元素,另一个(指针B)指向下一个待比较的元素,若待比较的元素的值与当前元素的值相等,指针B便向后移一位;若不相等,指针A向后移一位,使用指针B指向的元素覆盖指针A指向的元素,然后指针B向后移一位。;直到数组中的所有元素都参与比较后,返回指针A的值+1。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) return 0;
int index = 0;
for (int i = 1; i < nums.size(); i++){
if (nums[i] != nums[index])
nums[++index] = nums[i];
}
return index + 1;
}
};
时间复杂度:(O(n))
空间复杂度:(O(1))