首页 > 其他分享 >659. 分割数组为连续子序列

659. 分割数组为连续子序列

时间:2023-03-20 23:47:05浏览次数:51  
标签:nums endMap put num 数组 cntMap 序列 getOrDefault 659

给你一个按 非递减顺序 排列的整数数组 nums 。

请你判断是否能在将 nums 分割成 一个或多个子序列 的同时满足下述 两个 条件:

每个子序列都是一个 连续递增序列(即,每个整数 恰好 比前一个整数大 1 )。
所有子序列的长度 至少 为 3 。
如果可以分割 nums 并满足上述条件,则返回 true ;否则,返回 false 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/split-array-into-consecutive-subsequences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


import java.util.HashMap;
import java.util.Map;

class Solution {
    public boolean isPossible(int[] nums) {
        if (nums == null || nums.length < 3) {
            return false;
        }
        Map<Integer, Integer> cntMap = new HashMap<>();
        Map<Integer, Integer> endMap = new HashMap<>();

        for (int num : nums) {
            cntMap.put(num, cntMap.getOrDefault(num, 0) + 1);
        }

        for (int num : nums) {
            int cnt = cntMap.getOrDefault(num, 0);
            if (cnt > 0) {
                int preEndCnt = endMap.getOrDefault(num - 1, 0);
                if (preEndCnt > 0) {
                    cntMap.put(num, cnt - 1);
                    endMap.put(num, endMap.getOrDefault(num, 0) + 1);
                    endMap.put(num - 1, preEndCnt - 1);
                } else {
                    int nxt1Cnt = cntMap.getOrDefault(num + 1, 0);
                    int nxt2Cnt = cntMap.getOrDefault(num + 2, 0);
                    if (nxt1Cnt != 0 && nxt2Cnt != 0) {
                        cntMap.put(num, cnt - 1);
                        cntMap.put(num + 1, nxt1Cnt - 1);
                        cntMap.put(num + 2, nxt2Cnt - 1);
                        endMap.put(num + 2, endMap.getOrDefault(num + 2, 0) + 1);
                    } else {
                        return false;
                    }

                }
            }

        }

        return true;
    }
}

标签:nums,endMap,put,num,数组,cntMap,序列,getOrDefault,659
From: https://www.cnblogs.com/tianyiya/p/17238429.html

相关文章