使用双指针删除有序数组中的重复元素项

题目描述

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

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

思路

(1)对于前k项元素,即使为相同元素也最多出现k次,符合题目要求,因此可以直接保留

(2)对于后面的n-k项,我们可以使用一个快指针q和一个慢指针p,利用慢指针来更新正确答案位置的元素值,用快指针来扫描后面的元素。

(3)如今需要着重考虑的一点是:如何判断是否应该更新元素值。当快指针q指向一位元素时,我们应该考虑它的出现次数,如果小于k次则利用慢指针p更新该元素,否则直接跳过当前元素。因为一个元素最多出现k次,因此我们需要知道在已获得的正确元素数组(即慢指针之前的元素序列)中该元素出现的次数,由于整个数组为升序序列,因此只需比较慢指针p前面第k个元素位置的值是否等于当前快指针q所指向的值,若等于则代表该元素值已经出现k次,不需要再保留该值;若不等于则代表该元素出现次数小于k,可以直接将该元素值写入到前面的位置。

(4)最后,我们需要返回满足条件的元素的个数,由前面步骤得知慢指针p总是在正确序列的下一位位置,因此可以直接返回p的值。

例题

80. 删除有序数组中的重复项 II - 力扣(LeetCode)

case1:[1,1,1,2,2,3]

case2:[0,0,1,1,1,1,2,3,3]

此题中k=2

题解

class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums.length<=2)
            return nums.length;
        int p=2,q=2;
        while(q

你可能感兴趣的:(算法,java,leetcode)