我的js算法爬坑之旅-分割数组为连续子序列

141 阅读1分钟

第五十八天:力扣659题,分割数组为连续子序列

地址:leetcode-cn.com/problems/sp…

思路:javascript使用Map统计nums然后遍历map 每次刮一个合法字串出来 直到把nums刮完

var isPossible = function(nums) {
    // 统计nums 将结果放在map里面
    let map = new Map();
    for(let i=0; i<nums.length; i++) {
        let key = nums[i];
        map.get(key) ? map.set(key, map.get(key) + 1) : map.set(key, 1);    }

    while(nums.length > 0) {
        let count = 0;
        let prev_key = -1;
        let prev_count = 0;
        for(let [key, value] of map) {
            // 跳过条件: 未开始计数 当前值为0
            if(value == 0 && count == 0) continue;

            // 结束条件: 键不连续
            if(prev_key != -1 && prev_key+1 != key) break;
            // 结束条件: 值不连续
            if(value < prev_count) break;
            
            // 记录本次的键和值
            prev_count = value;
            prev_key = key;
            
            // 更新map将本次的值 -1
            map.set(key, value-1);
            // 更新nums长度 -1
            nums.pop();
            // 更新本次遍历取得连续字串长度 +1
            count++;
        }
        // 遍历剩余map 取出的连续字串长度小于3 失败
        if(count < 3) return false;
    }
    // 结束while, 将nums成功分解完毕 成功
    return true;
};

执行用时:116 ms, 在所有 JavaScript 提交中击败了98.00%的用户

内存消耗:45.2 MB, 在所有 JavaScript 提交中击败了80.00%的用户