删除有序数组k个重复项
leetcode 26
删除有序数组重复项
对于数组删除元素,不要删一个就移动后面所有的,这会使得时间复杂度过高
应该定义一个无重复标记s,即s位置之前的所有元素都满足题目要求,for循环负责遍历,当碰到不满足题意的元素时,s标记保持不变,for循环继续向后遍历,直到碰到满足题意的元素时,将当前遍历的元素复制到s标记处
此题若nums[s-1]==nums[i]时则不满足题意
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<2) return nums.size();
int s=0;
for(int i=0;i<nums.size();i++){
if(i<1||nums[s-1]!=nums[i]){
nums[s++]=nums[i];
}
}
return s;
}
};
leetcode 80
删除有序数组中重复项ii
此题与前面的题目几乎一样
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<3) return nums.size();
int s=0;
for(int i=0;i<nums.size();i++){
if(i<2||nums[s-2]!=nums[i]){
nums[s++]=nums[i];
}
}
return s;
}
};
删除有序数组k个重复项
问题抽象出来,可以写成:
class Solution {
public:
int work(vector<int>& nums, int k) {
int len = 0;
for(auto num : nums)
if(len < k || nums[len-k] != num)
nums[len++] = num;
return len;
}
int removeDuplicates(vector<int>& nums) {
return work(nums, 2);
}
};