题目
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定 nums = [1,1,1,2,2,3],
函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
你不需要考虑数组中超出新长度后面的元素。 示例 2:
给定 nums = [0,0,1,1,1,1,2,3,3],
函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
与26题相似,同样使用双指针,只是该题加入了一个限制条件,每个元素最多出现两次,因此在移动指针时还需要考虑元素出现的次数。左指针i
指向当前重复少于2次的元素的末尾,右指针j
遍历数组,使用count
(最小值为1)记录当前元素出现的次数。
- 当
j
指向元素与i
指向元素不同时说明有新元素,此时将其存到i+1
处,并将指针i++
,更新count=1
表明当前j
指向的元素出现次数为1. - 否则说明
j
指向元素与i
指向元素相同,将count++
,若count<=2
则表明当前元素未出现大于2次,则将j
指向的元素存到i+1
处,并将i++
。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() == 0) {
return nums.size();
}
int i = 0;
int count = 1;
for (int j = 1; j < nums.size(); j++) {
if (nums[j] != nums[i]) {
nums[i + 1] = nums[j];
i++;
count = 1;
continue;
}
else {
count++;
if (count <= 2) {
nums[i + 1] = nums[j];
i++;
}
}
}
return i + 1;
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)