分析
-
本题的考点:双指针。
-
和Leetcode 0026 删除排序数组的重复项做法一样,将
T
换成2即可,如下是分析: -
对于重复元素只保留一个,假设让我们对于重复元素保留
T
个($T \ge 1$),我们应该怎么做? -
依次遍历每个元素,假设当前遍历到第
i
个元素,我们最终结果是[0, k)
之间的元素,如果k-T<0
,则当前元素nums[i]
需要被保留,否则的话如果nums[i] != nums[k-T]
,说明nums[i]
应该被保留,如下图:
代码
- C++
class Solution {
public:
const int T = 2;
int removeDuplicates(vector<int>& nums) {
int k = 0;
for (int i = 0; i < nums.size(); i++)
if (k - T < 0 || nums[i] != nums[k - T])
nums[k++] = nums[i];
return k;
}
};
- Java
class Solution {
static final int T = 2;
public int removeDuplicates(int[] nums) {
int k = 0;
for (int i = 0; i < nums.length; i++)
if (k - T < 0 || nums[i] != nums[k - T])
nums[k++] = nums[i];
return k;
}
}
时空复杂度分析
-
时间复杂度:$O(n)$,
n
为数组长度。 -
空间复杂度:$O(1)$。