被卡了N天,这题的要求很严格,既要求就地还要求只用O(1)空间还要求使用O(n)的时间
很棒的思路,总的来说跟unique的实现差不多,区别在于unique往前看1个此题需要看2个,可以自然的推广到k个的情况
解释一下代码含义
i是扫描的index,k是填充的index
前两个数自然什么都不用管直接填充即可,关键在于第3个数开始需要判断它是否跟k-2位置的数相等,如果和k-2位置的数相等,则意味着i和k-2和k-1位置的数都相等,需要放弃,否则就填充
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k = 0;
for(int i = 0; i < nums.size(); ++i)
if(k < 2 or nums[i] != nums[k-2]) nums[k++] = nums[i];
return k;
}
};
同样的思路也可以用在27上,防止因为自己傻逼而挂掉
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = 0;
for(int i = 0; i < nums.size(); ++i)
if(nums[i] != val) nums[k++] = nums[i];
return k;
}
};
这样的写法比起while写法 时间复杂度好也更不容易出错
网友评论