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


题目描述:


输入一个按升序排序的整数数组(可能包含重复数字),你需要将它们分割成几个子序列,其中每个子序列至少包含三个连续整数。返回你是否能做出这样的分割?


 


示例 1:



输入: [1,2,3,3,4,5]

输出: True

解释:

你可以分割出这样两个连续子序列 :

1, 2, 3

3, 4, 5


#### 大家一起斗地主啦!




解法参考题解区大佬,两个hash 加 贪心


/**
 * @param {number[]} nums
 * @return {boolean}
 */
var isPossible = function(nums) {
    
    let counter = new Array(10000).fill(0);
    let end = new Array(10000).fill(0);
    
    //以上实现两个hash(网上实现hash太费劲了,取了个巧,浪费了点空间) 
    
    //先把每种牌的总数记下
    nums.forEach((item)=>{
        counter[item] ++;
    })
    
    
    // nums.forEach((item)=>{
    //forEach 没法continue
    
    //以下采取贪心策略:
    for(let i = 0 ;i<nums.length;i++){
        let item = nums[i];
        if(counter[item] === 0){//这种牌没得了,直接下一个
            continue;
        }
        counter[item] --;
        
        if(end[item-1] > 0){ //可以续上先续上
            end[item-1] --;
            end[item] ++;
        }
        
        //因为是升序排列,所以如果有[1,2,3,4,4,5,6]时
        //先是4接上[1,2,3],然后另外一个4连上后头的,组成[4,5,6]
        //关键在数组已经按升序排序
        else if(counter[item+1] > 0 && counter[item+2] > 0){
            counter[item+1] --;
            counter[item+2] --;
            end[item+2] ++;
        }
        else{
            return false;
        }
        
        
    };
    return true;
    
    
};