zoukankan      html  css  js  c++  java
  • LeetCode 659. 分割数组为连续子序列

    地址 https://leetcode-cn.com/problems/split-array-into-consecutive-subsequences/

    给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。
    如果可以完成上述分割,则返回 true ;否则,返回 false 。
    
    示例 1:
    输入: [1,2,3,3,4,5]
    输出: True
    解释:
    你可以分割出这样两个连续子序列 : 
    1, 2, 3
    3, 4, 5
     
    
    示例 2:
    输入: [1,2,3,3,4,4,5,5]
    输出: True
    解释:
    你可以分割出这样两个连续子序列 : 
    1, 2, 3, 4, 5
    3, 4, 5
     
    
    示例 3:
    输入: [1,2,3,4,4,5]
    输出: False
     
    
    提示:
    输入的数组长度范围为 [1, 10000]

    解法 

    算法1
    这道题目有点类似 扑克牌里面的搭配出全手顺子(每手顺子必须大于等于5张)
    开始使用的DFS 结果到第80个用例 TLE了
    仔细分析题意后会发现
    1 每张牌i要么和i-1结尾的序列结合成新的以i结尾的序列
    2 要么就是组成新的以i开头以i+2结尾的序列(长度3)
    显然能用方法2处理的牌,都可以使用方法1处理。
    假设有不同长度的以i结尾的序列,方法1可以任选其中一个,长度是无须考虑的,具有替换性
    当时能用方法1处理的牌 不见得能用方法2处理 因为方法2要求序列长度至少为3
    所以优先使用方法1处理牌 然后使用方法2处理牌 如果还不行,则说明无法处理

    class Solution {
    public:
        unordered_map<int, int> numCountMap;
        unordered_map<int, int> endWith;
        int count = 0;
    
        bool isPossible(vector<int>& nums) {
            for (auto& e : nums) {
                numCountMap[e]++;
                count++;
            }
    
            for (auto& currVal : nums) {
                if (numCountMap[currVal] == 0) continue;
                if (count == 0) return true;
                int isCanHandle = 0;
                if (endWith[currVal - 1] > 0) 
                {
                    isCanHandle = 1;
                    //如果有上一数值结尾的数列 尝试加进去
                    endWith[currVal - 1]--;
                    endWith[currVal]++;
                    numCountMap[currVal]--;
                    count--;
                }
                else if(numCountMap[currVal + 1] > 0 &&
                    numCountMap[currVal + 2] > 0)
                {
                    //组成新的以currVal开头以currVal+2结尾的序列(长度3)
                    isCanHandle = 1;
                    endWith[currVal + 2]++;
                    numCountMap[currVal]--;
                    numCountMap[currVal + 1]--;
                    numCountMap[currVal + 2]--;
                    count -= 3;
                }
    
                if (0 == isCanHandle) return false;
            }
    
            return 0==count;
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    python登录csdn并自动评论下载资源脚本
    聊聊C语言的预编译指令include
    ANSI C、ISO C、Standard C联系与区别
    我对在开发板上开发程序的一些理解
    关于CMTS设备的一些备忘
    一个简单的EJB例子
    手动部署EJB于WebLogic
    eclipse+MyEclipse+WebLogic开发简单的EJB
    我对视频“分辨率”的理解以及在电视上显示的理解
    VC win32 static library静态链接库简单示例
  • 原文地址:https://www.cnblogs.com/itdef/p/14087918.html
Copyright © 2011-2022 走看看