algorighm/leetcode/中等/删除数组中的重复项2.js

72 lines
2.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
80. 删除有序数组中的重复项 II
已解答
中等
相关标签
相关企业
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
示例 1
输入nums = [1,1,1,2,2,3]
输出5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。
示例 2
输入nums = [0,0,1,1,1,1,2,3,3]
输出7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前七个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列
*/
/**
思路这个和我们之前的26题思路是一样的只不过这一次的每个数最多可以重复两次我们从第三个数开始
往后便利因为最多可以重复两次所以前面的两个数无论如何都是有效的下载我们用一个i下表记录有效数组
的长度如果便利的元素和2的的元素相同那么i-2,i-1,到j的元素都是重复的这一部分直接忽略掉。
*/
/**
* @param {number[]} nums
* @return {number}
*/
const removeDuplicates = function (nums) {
const len = nums.length;
if (len < 3) return len;
let i = 2; // 记录有效数组的长度最初有效长度为2
for (let j = 2; j < len; j++) {
if (nums[i - 2] !== nums[j]) {
nums[i] = nums[j];
i++;
}
}
return i;
};
const arr = [0, 0, 1, 1, 1, 1, 2, 3, 3];
console.log(removeDuplicates(arr));
console.log(arr);