letcode每日一题- 分割数组为连续子序列

题目描述如下:

对于数组中的元素 x,如果存在一个子序列以 x-1 结尾,则可以将 x加入该子序列中。将 x 加入已有的子序列总是比新建
一个只包含 x 的子序列更优,因为前者可以将一个已有的子序列的长度增加 1,而后者新建一个长度为 1 的子序列,而题
目要求分割成的子序列的长度都不小于 3,因此应该尽量避免新建短的子序列。
基于此,可以通过贪心的方法判断是否可以完成分割。
使用两个哈希表,第一个哈希表存储数组中的每个数字的剩余次数,第二个哈希表存储数组中的每个数字作为结尾的子序列
的数量。
代码实现如下:


public boolean isPossible(int[] nums) {
        Map<Integer, Integer> numMap = new HashMap<>();
        Map<Integer, Integer> endMap = new HashMap<>();
        for (int x : nums) {
            //统计出现次数
            numMap.put(x, numMap.getOrDefault(x, 0) + 1);
        }
        for (int x : nums) {
            int count = numMap.getOrDefault(x, 0);
            if (count > 0) {
                int prevEndCount = endMap.getOrDefault(x - 1, 0);
                if (prevEndCount > 0) {
                    //并入老队列
                    numMap.put(x, count - 1);
                    endMap.put(x - 1, prevEndCount - 1);
                    endMap.put(x, endMap.getOrDefault(x, 0) + 1);
                } else {
                    //创建新队列
                    int count1 = numMap.getOrDefault(x + 1, 0);
                    int count2 = numMap.getOrDefault(x + 2, 0);
                    if (count1 > 0 && count2 > 0) {
                        numMap.put(x, count - 1);
                        numMap.put(x + 1, count1 - 1);
                        numMap.put(x + 2, count2 - 1);
                        endMap.put(x + 2, endMap.getOrDefault(x + 2, 0) + 1);
                    } else {
                        return false;
                    }
                }
            }
        }
        return true;
    }

posted @ 2020-12-04 11:20  CodeWangHAHA  阅读(113)  评论(0编辑  收藏  举报