网站建设的好不好,wordpress一键还原,网络广告营销的概念,wordpress慢6从0开始的秋招刷题路#xff0c;记录下所刷每道题的题解#xff0c;帮助自己回顾总结
80. 删除有序数组中的重复项 II
给你一个有序数组 nums #xff0c;请你 原地 删除重复出现的元素#xff0c;使得出现次数超过两次的元素只出现两次 #xff0c;返回删除后数组的新长…从0开始的秋招刷题路记录下所刷每道题的题解帮助自己回顾总结
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 * 10410^4104 -10410^4104 nums[i] 10410^4104 nums 已按升序排列
解题思路 一个指针 i 用来遍历 nums 数组另一个指针 index 始终指向有效数组的末尾。
当前位置上的元素与其前一个元素不相等时即 nums[i - 1] ! nums[i]进行覆盖并将当前位置的元素 nums[i]放到有效数组中最后的位置并令 count 值重新为 1因为出现了新的元素并且该元素是第一次出现即 nums[index] nums[i]
当相邻位置相等且 count 2 时由于题中说到每个元素最多出现两次所以该元素还可以出现一次则将当前位置上的元素放到有效数组中的最后位置并令记录该元素的出现次数即 count
当相邻位置相等且 count 2 时说明当前值的元素已经出现连续两个相同的了则不需要进行任何操作直接 continue 即可。
直到遍历结束最后返回有效数组的长度 index 即可。 示例[1,1,1,2,2,3]其中有效数组长度初始为 index 1. i 1nums[0] nums[1] 且 count 1则 nums[1] nums[1]count 2index 2 i 2nums[1] nums[2] 且 count 2直接跳过不进行任何处理 i 3nums[2] ! nums[3] 则 nums[2] nums[3]count 1index 3 i 4nums[3] nums[4] 且 count 1则 nums[3] nums[4]count 2index 4 i 5nums[4] ! nums[5] 则 nums[4] nums[5]count 1index 5 最终返回index 5有效数组为 [1, 1, 2, 2, 3] 注意题中说到的每个元素最多出现两次可以将两次改为 k 次此时只需要将第二个判断中的 count 2 修改为 count k 即可。 代码
class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n 2) return n;int count 1;int index 1;for (int i1;in;i) {if (nums[i] ! nums[i - 1]) {nums[index] nums[i];count 1;} else if (count 2) { // 两个元素值相等并且之前没有重复nums[index] nums[i];count;} else {continue;}}return index;}
}时间复杂度O(n) 空间复杂度O(1)