1. 题意
给定一个重复数组,删除其中的重复项目。
2. 题解
双指针
一个指针指向有序不重复数组的最后一个数,另外一个数遍历整个数组,若两个指针对应用的数不相同,有序数组的指针右移,将数填入。
- 代码一
c
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int sz = nums.size();
int cnt = 0;
for (int i = 1;i < sz; ++i) {
if (nums[i] != nums[cnt]) {
nums[++cnt] = nums[i];
}
}
return cnt + 1;
}
};
- 通解
只要 n u m s [ l e n − 1 ] ≠ n u m s [ j ] nums[len - 1]\ne nums[j] nums[len−1]=nums[j], 就需要将 n u m s [ j ] nums[j] nums[j]给放入有序数组。推广一下,如果相同的数不超过 k k k个,就只需要 n u m s [ l e n − k ] ≠ n u m s [ j ] nums[len - k] \ne nums[j] nums[len−k]=nums[j]。
cpp
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int sz = nums.size();
int cnt = 1;
for (int i = 1;i < sz; ++i) {
if (nums[i] != nums[cnt - 1]) {
nums[cnt++] = nums[i];
}
}
return cnt;
}
};