LeetCode面试经典150题—03 删除有序数组中的重复项 Ⅱ

  • HashMap 存储

    类似题目 2 移除元素的思路,用 HashMap 存储元素及出现次数,大于等于 3 时就更新数组

    代码如下:

public static int removeDuplicates(int[] nums) {
        int ans = nums.length;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < ans; i++) {
            map.put(nums[i], map.get(nums[i]) == null ? 1 : map.get(nums[i]) + 1);
            if (map.get(nums[i]) >= 3) {
                ans--;
                for (int j = i; j < ans; j++) {
                    nums[j] = nums[j + 1];
                }
                i--;
            }
        }
        return ans;
    }

  • 双指针

    设置快慢双指针,快指针用于遍历,表示下一个要检查的元素的下标,慢指针表示要保留的最新元素的下标

    代码如下:

public static int removeDuplicates(int[] nums) {
        int n = nums.length;
        //slow:确定要保留的最后一个元素位置
        //fast:遍历,接下来要检查的第一个元素位置
        int slow = 2, fast = 2;
        while (fast < n) {
            if (nums[slow - 2] != nums[fast]) {
                //保留元素
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }

  • 数组有序 & 保留逻辑(宫水三叶解法)

    利用数组有序和保留逻辑两大主要性质,直接保留前 2 个数字,后面的元素,与最后一种保留元素的第一个数比较,不同则保留
    
    代码如下:

public static int removeDuplicates(int[] nums) {
        //index: 保留数组的下标
        int index = 0;
        for (int x : nums) {
            if (index < 2 || nums[index - 2] != x) {
                nums[index++] = x;
            }
        }
        return index;
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值