回顾用的,原题链接:. - 力扣(LeetCode)
题目描述
给你一个非严格递增排列的数组 nums
,请你原地删除重复出现的元素,使每个元素只出现一次,并返回删除后数组的新长度。同时,需要保持元素的相对顺序一致。最后返回 nums
中唯一元素的个数。
解题思路
考虑到数组是非严格递增的,我们可以使用双指针的方法来原地修改数组。一个指针用于遍历数组,另一个指针用于指向当前唯一元素的末尾位置。
在遍历过程中,如果当前元素与上一个唯一元素不同,就将其赋值给下一个唯一元素的位置,并移动唯一元素末尾位置的指针。这样,遍历结束后,唯一元素末尾位置的指针所指向的下一个位置就是新数组的长度。
判题标准
系统会使用以下代码来测试你的题解:
int[] nums = [...]; // 输入数组 | |
int[] expectedNums = [...]; // 期望的答案数组,长度正确 | |
int k = removeDuplicates(nums); // 调用你的函数 | |
assert k == expectedNums.length; // 断言新数组长度与期望数组长度一致 | |
for (int i = 0; i < k; i++) { | |
assert nums[i] == expectedNums[i]; // 断言新数组的每个元素与期望数组对应位置的元素一致 | |
} |
如果所有断言都通过,那么你的题解将被视为正确。
示例
示例 1
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应返回新数组的长度为 2,并将原数组的前两个元素修改为 1 和 2。数组中的其余元素不重要。
示例 2
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应返回新数组的长度为 5,并将原数组的前五个元素修改为 0, 1, 2, 3, 4。数组中的其余元素不重要。
提示
- 数组长度
1 <= nums.length <= 3 * 10^4
- 数组元素范围
-10^4 <= nums[i] <= 10^4
- 数组
nums
已按非严格递增顺序排列
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int number=nums.size();
int front=0;
if(number==0) return 0;
for(int end=0;end<number;end++){
if(nums[front]!=nums[end]){
nums[++front]=nums[end];
}
}
return front+1;
}
};
假设我们有一个数组 nums
为:[1, 1, 2, 2, 3]。
初始化阶段:
number
:数组nums
的大小,这里为 5。front
:初始化为 0,表示当前不重复序列的尾部位置。
如果 number
为 0,说明数组为空,直接返回 0。这里数组不为空,所以继续执行去重操作。
遍历开始:
end
:从 0 开始遍历数组nums
。
第一次循环(end = 0):
nums[front]
(即nums[0]
)的值是 1。nums[end]
(也是nums[0]
)的值也是 1。- 因为它们相等,所以不进行任何操作,
front
保持不变。
第二次循环(end = 1):
nums[front]
的值是 1。nums[end]
的值是 1。- 仍然相等,所以
front
不变。
第三次循环(end = 2):
nums[front]
的值是 1。nums[end]
的值是 2。- 它们不相等,因此将
nums[end]
的值 2 赋给nums[++front]
,即nums[1]
也变为 2。 - 此时,
front
变为 1,数组的前两个元素变为 [1, 2]。
第四次循环(end = 3):
nums[front]
的值是 2。nums[end]
的值是 2。- 它们相等,所以
front
不变。
第五次循环(end = 4):
nums[front]
的值是 2。nums[end]
的值是 3。- 它们不相等,因此将
nums[end]
的值 3 赋给nums[++front]
,即nums[2]
变为 3。 - 此时,
front
变为 2,数组的前三个元素变为 [1, 2, 3]。
遍历结束:
front
的值为 2,表示不重复序列的长度为 3(因为front
是从 0 开始计数的)。
函数返回:
- 最后,函数返回
front + 1
,即 3,这表示新的无重复数组的长度为 3。 - 同时,原数组
nums
也被修改为 [1, 2, 3],即移除了所有重复项。
扩展:三叶姐的通用解法:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
return process(nums,1);
}
int process(vector<int>& nums,int k){
int idx = 0;
for(auto x : nums){
if(idx < k or nums[idx - k] != x){
nums[idx++] = x;
}
}
return idx;
}
};
作者:宫水三叶
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/575549/shua-chuan-lc-jian-ji-shuang-zhi-zhen-ji-2eg8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。