Leetcode 26 删除排序数组中的重复项
题目描述
给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入nums的前k个位置后返回 k 。
不要使用额外的空间,你必须在原地修改输入数组 并在使用**O(1)**额外空间的条件下完成。
来源:力扣(LeetCode)题目链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解1(迭代器)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty()) return 0;
int pre = *nums.begin();
for(auto iter = nums.begin()+1; iter < nums.end();){
if(pre == *iter){
iter = nums.erase(iter);
}else{
pre = *iter;
iter++;
}
}
return (int)nums.size();
}
};
// 简单erase
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int s = nums.size();
if(1==s) return s;
int i=1;
while(i < s){
int j=i;
while(j<s && nums[j]==nums[j-1])
j++;
if(j>i){
nums.erase(nums.begin()+i, nums.begin()+j);
s -= (j-i); //erase改size,不改capacity
}else
i++;
}
return nums.size();
}
};
题解2(双指针)(best)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 0;
for(size_t j = 1; j < nums.size();){
if(nums[i] == nums[j]){
j++;
}else{
i++;
nums[i] = nums[j];
}
}
return i+1;
}
};
题解3(unique函数)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//unique函数: 将重复的放到数组后部分,并返回重复的第一项(已经放在后面的)
//利用erase 删除后面的就可
nums.erase(unique(nums.begin(), nums.end()), nums.end());
return nums.size();
}
};