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

题目描述:

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

输入:

nums = [1,1,1,2,2,3]

输出:

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

代码实现:

使用快慢指针复杂度最低,这里采用的是TreeMap:有序,不重复,无索引

public class Main {
    public static void main(String[] args) {
        int[] nums = new int[]{-3, -1, 0, 0, 0, 3, 3};
        //打印返回值
        System.out.println(removeDuplicates(nums));
        //查看原数组结果
        System.out.println(Arrays.toString(nums));
    }

    public static int removeDuplicates(int[] nums) {
        // 定义一个 TreeMap 存储: 数组中元素值为 key,元素出现的次数为 value
        TreeMap<Integer, Integer> tm = new TreeMap<>();
        // 遍历数组,统计元素出现的次数
        for (int num : nums) {
            // getOrDefault(K key, V defaultValue): 用于获取指定键 key 对应的值,如果键不存在,则返回默认值 defaultValue。
            tm.put(num, tm.getOrDefault(num, 0) + 1);
        }
        // 记录结果数组的元素个数
        int index = 0;
        // 遍历 TreeMap,按题目要求覆盖原数组
        // 引用迭代器
        Iterator<Map.Entry<Integer, Integer>> iterator = tm.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, Integer> entry = iterator.next();
            // 获取到当前实体的键值对
            Integer key = entry.getKey();
            Integer value = entry.getValue();
            if (value >= 2) {
                // 大于等于 2 时,将 key 覆盖原数组两次
                nums[index++] = key;
                nums[index] = key;
                index++;
            } else {
                // 当 value 小于 2 时,即出现一次的情况,则覆盖原数组一次
                nums[index++] = key;
            }
        }
        return index;
    }
}

你可能感兴趣的:(力扣刷题,java,算法,数据结构)