我的思路是这样的:声明一个int 型变量 k,在[0,k]范围内保存遍历后合格的元素,合格的判定方法有两个判断,一个是遍历时与k对应的元素不相等的元素。第二个判定是处理每个元素最多出现两次,我是当遍历到 i 个元素时,判断 i 对应的元素与上一个元素相等,与上上个元素,也就是 i - 2 对应的元素不相等。具体实现代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size < 3){
return nums.size;
}
int k = 1;
for(int i = 2; i < nums.size(); i++){
if(nums[i] != nums[k] || (nums[i] == nums[i - 1] && nums[i] != nums[i - 2])){
k++;
nums[k] = nums[i];
}
}
return k + 1;
}
};i 从 2开始遍历是为了i 要与 i - 2进行元素大小的比较,为了防止出现数组越界的问题。k 赋初值为 1 是新数组的前两个元素肯定为数组的前两个元素,遍历时如果元素合格,k + 1后 与 i 对应的元素交换位置。 然后 执行代码,输入[1,1,1,2,2,3]
,却输出[1,1,2,3],这我就感到有点费解了,bobo老师,我表达的清不清楚?希望指点一下。