LeetCode 80题 -> 删除排序数组中的重复项Ⅱ
1. 回顾LeetCode 28题:删除排序数组中的重复项
-
题目描述:给定一个排序数组,需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
注意:不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
-
示例:
nums = [1,1,2], 返回 2, 原数组 nums 的前两个元素被修改为 1, 2。 nums = [0,0,1,1,1,2,2,3,3,4], 返回 5, 原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
-
解题思路:快慢指针!
- ①慢指针slow初始位置为0,快指针fast初始位置为1,遍历数组;
- ②判断nums[fast]是否等于nums[slow];
- ③如果相等,跳过继续遍历数组,即fast++;
- ④如果不相等,覆盖slow+1位置的值,即nums[slow + 1] = nums[fast],并且fast++, slow++;
- ⑤遍历完数组后,退出循环,slow+1即为移除后数组的新长度。
-
代码实现:
class Solution { public int removeDuplicates(int[] nums) { int slow = 0; int fast = 1; while(fast < nums.length){ if(nums[slow] == nums[fast]){ fast++; }else{ nums[slow + 1] = nums[fast]; fast++; slow++; } } return slow + 1; } }
2. 根据26题思路,分析80题
-
题目描述:给定一个增序排列数组 nums ,需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
-
示例:
输入:nums = [1,1,1,2,2,3] 输出:5, nums = [1,1,2,2,3]
-
解题思路与26题一致,快慢指针覆盖重复元素。
-
代码实现:
class Solution { public int removeDuplicates(int[] nums) { int slow = 0; int fast = 2; while(fast < nums.length){ if(nums[slow] == nums[fast]){ fast++; }else{ nums[slow + 2] = nums[fast]; slow++; fast++; } } return slow+2; } }