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

LeetCode面试经典150题—03 删除有序数组中的重复项 Ⅱ_第1张图片

  • HashMap 存储

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

    代码如下:

public static int removeDuplicates(int[] nums) {
        int ans = nums.length;
        Map 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;
    }


 

你可能感兴趣的:(LeetCode,leetcode,面试,算法)