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

题目描述

给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素最多出现两次,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组 并在使用O(1)额外空间的条件下完成。
80. 删除有序数组中的重复项 II 难度:简单

题解

直接用双指针。slow指针指向新的数组(输入数组的前面)的第一项,fast指针指向当前处理的输入数组的项。
若slow<1或者fast指向的元素不等于slow-1指向的元素,那么,fast指向的元素应该添加到slow维护的数组中。
最后,输入数组的0~slow项为处理后的数组。处理后的数组长度为slow + 1。
代码:

class Solution {
    public int removeDuplicates(int[] nums) {
        int slow = -1;
        int fast = 0;
        for(;fast < nums.length;fast++){
            if(slow < 1 || nums[slow-1] != nums[fast]){
                nums[++slow] = nums[fast];
            }
        }
        return slow + 1;
    }
}

只遍历一遍数组,时间复杂度为O(n)。辅助空间为常数空间O(1)。

posted @ 2021-04-06 19:38  HickeyZhang  阅读(47)  评论(0编辑  收藏  举报