数组去重
任务描述
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成,不需要管后面的数。
例:
给定数组 nums = [1,1,2],
输出:2 且nums = [1,2,-]
例:
给定数组 nums = [0,0,1,1,1,2,2,3,3,4],
输出:5 且nums = [0,1,2,3,4,-]
解决思路
双指针,一个指向结果的第j个元素,一个指向原数组的第i个元素
……一直循环直到i走到头,输出i就行
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto len = nums.size();
if(len == 0)
return 0;
if(len == 1)
return 1;
auto i = 0;
for(auto j = 1; j < len; j++)
{
if(nums[i] != nums[j])
nums[++i] = nums[j];
}
return i + 1;
}
};
时间复杂度分析
时间复杂度 O ( n ) O(n) O(n)
练习题
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto len = nums.size();
if(len == 0)
return 0;
if(len == 1)
return 1;
auto i = 0;
for(auto j = 1; j < len; j++)
{
if(nums[i] != nums[j])
nums[++i] = nums[j];
}
return i + 1;
}
};
- 移除元素
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0, right = nums.size();
while (left < right) {
if (nums[left] == val) {
nums[left] = nums[right - 1];
right--;
} else {
left++;
}
}
return left;
}
};