题目:
这种简单直接的方法还是可以过的,但是效率很低很低,几乎是擦边过。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <algorithm> #include <vector> using std::vector;
class Solution { public: int removeDuplicates(vector<int> &nums) { int i, n; n = nums.size(); i = 0;
while (i < nums.size()) { if (i >= 2 && nums[i] == nums[i - 1] && nums[i - 1] == nums[i - 2]) { nums.erase(nums.begin() + i); } else { i++; } }
return nums.size(); } };
|
采用双指针方法更为高效(快慢指针),在原数组上“覆盖掉”多余的元素。
- 慢指针(slow):指向当前结果数组的末尾。
- 快指针(fast):遍历整个数组。
如果 slow < 2,直接保留(因为前两个元素无论如何都要保留)。
如果 nums[fast] != nums[slow - 2],说明新数字还没超过 2 次, 覆盖 num[slow]的值。
否则跳过。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: int removeDuplicates(vector<int>& nums) { int n = nums.size(); if (n <= 2) { return n; } int slow = 2, fast = 2; while (fast < n) { if (nums[slow - 2] != nums[fast]) { nums[slow] = nums[fast]; ++slow; } ++fast; } return slow; } };
|