LeetCode 26. Remove Duplicates from Sorted Array
Given an integer array nums sorted in non-decreasing order
, remove the duplicates
in-place such that each unique element appears only once
. The relative order
of the elements should be kept the same
.
Return k after placing the final result in the first k slots of nums.
Do not allocate extra space for another array. You must do this by modifying the input array in-place with $O(1)$ extra memory.
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。
method: 快慢指针
快指针指向的元素与慢指针-1
的元素相比较
- 相同,快指针
+1
,慢指针不动 - 不同,快指针赋值给慢指针,都
+1
int removeDuplicates(vector<int>& nums) {
if (nums.size() < 1) return nums.size();
int index = 1;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] != nums[index - 1]) {
nums[index] = nums[i];
index++;
}
}
return index;
}
时间复杂度:$O(n)$
空间复杂度:$O(1)$
LeetCode 80. Remove Duplicates from Sorted Array II
Given an integer array nums sorted in non-decreasing order
, remove some duplicates in-place such that each unique element appears at most twice
. The relative order
of the elements should be kept the same
.
method: 快慢指针
原理一样,只是快指针与慢指针-2
的元素相比较
int removeDuplicates(vector<int>& nums) {
if (nums.size() < 2) return nums.size();
int index = 2;
for (int i = 2; i < nums.size(); i++) {
if (nums[i] != nums[index - 2]) {
nums[index] = nums[i];
index++;
}
}
return index;
}
总结
如果是允许N
个元素重复,快指针与慢指针-N
的元素相比较
int removeDuplicates(vector<int>& nums) {
if (nums.size() < N) return nums.size();
int index = N;
for (int i = N; i < nums.size(); i++) {
if (nums[i] != nums[index - N]) {
nums[index] = nums[i];
index++;
}
}
return index;
}