Split Array into Consecutive Subsequences

Given an array nums sorted in ascending order, return true if and only if you can split it into 1 or more subsequences such that each subsequence consists of consecutive integers and has length at least 3.

Example 1:

Input: [1,2,3,3,4,5]
Output: True
Explanation:
You can split them into two consecutive subsequences : 
1, 2, 3
3, 4, 5

Example 2:

Input: [1,2,3,3,4,4,5,5]
Output: True
Explanation:
You can split them into two consecutive subsequences : 
1, 2, 3, 4, 5
3, 4, 5

思路:用greedy,先统计频率,再用一个urgentTail hashmap来统计我即将需要的下一个数的频率,这题巧妙的思考就是数字是否使用过,是用count来标记的,用过就减一,下次判断的时候,看是否还有count,没有了,就代表不能再用了,被之前的用过了。

另外greedy的思想就是:每遇见一个数,如果还可以用,首先考虑urgentmap里面是否有人需要这个数,需要就加进去,并且同时加入下一个需要的数,这就是贪心,然后如果没有人需要,就开启一个3顺子,如果不能开启,代表不行,能开启,三个数频率-1,同时加入urgentmap下一个数;

class Solution {
    public boolean isPossible(int[] nums) {
        if(nums == null || nums.length == 0) {
            return false;
        }
        HashMap<Integer, Integer> frequencyMap = new HashMap<>();
        HashMap<Integer, Integer> urgentTail = new HashMap<>();
        
        for(Integer i: nums) {
            frequencyMap.put(i, frequencyMap.getOrDefault(i, 0) + 1);
        }
        
        for(Integer i: nums) {
            // 用count -1 代表已经用过了;如果还有没有用的,count number > 0;
            if(frequencyMap.get(i) <= 0) {
                continue;
            }
            // Greedy,首先满足已经有的顺子的尾巴,并且加入新的尾巴;
            if(urgentTail.getOrDefault(i, 0) > 0) {
                frequencyMap.put(i, frequencyMap.get(i) - 1);
                urgentTail.put(i, urgentTail.get(i) - 1);
                // Greedy,  把下一个也加进去;
                urgentTail.put(i + 1, urgentTail.getOrDefault(i + 1, 0) + 1);
            } else { 
                // 开始一个顺子:i, i + 1, i + 2; 
                if(frequencyMap.getOrDefault(i + 1, 0) > 0 
                       && frequencyMap.getOrDefault(i + 2, 0) > 0) {
                    frequencyMap.put(i, frequencyMap.get(i) - 1);
                    frequencyMap.put(i + 1, frequencyMap.get(i + 1) - 1);
                    frequencyMap.put(i + 2, frequencyMap.get(i + 2) - 1);
                    urgentTail.put(i + 3, urgentTail.getOrDefault(i + 3, 0) + 1);
                } else {
                    // 没有超过3个的顺子;
                    return false;
               }
            }  
        }
        return  true;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值