【LeetCode】80. 删除有序数组中的重复项 II

80. 删除有序数组中的重复项 II

知识点:数组;排序;双指针

题目描述

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。

输入: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 。 不需要考虑数组中超出新长度后面的元素。

解法一:双指针

这道题目和26题唯一的区别就是这道题目要求是可以有两个重复的,仍然用双指针,一个从头到尾遍历,一个是指示当前需要的数组的最后一个;因为可以有两个重复的,所以比较当前最后一个的前一个,如果不一样,那就可以添加(即使和最后一个一样也没事),如果一样了,那就证明index-1、index、还有i都是一样的,那就不添加,直接后移;

class Solution {
    public int removeDuplicates(int[] nums) {
        int index = 1;  //仍然指示结果数组的最后一个;
        for(int i = 2; i < nums.length; i++){
            if(nums[i] != nums[index-1]){
                index++;  //如果和index-1相等,那证明index-1、index、i都相等,因为是排序的,所以不能加入,直接后移;
                nums[index] = nums[i];
            }
        }
        return index+1;
    }
}

相关题目

26. 删除有序数组中的重复项

posted @ 2021-08-24 08:48  Curryxin  阅读(140)  评论(0编辑  收藏  举报
Live2D