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 numslen - 1\ne numsj numslen−1=numsj, 就需要将 n u m s j numsj numsj给放入有序数组。推广一下,如果相同的数不超过 k k k个,就只需要 n u m s l e n − k ≠ n u m s j numslen - k \ne numsj numslen−k=numsj。
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;
}
};