1. 程式人生 > 實用技巧 >659. 分割陣列為連續子序列

659. 分割陣列為連續子序列

class Solution {
public:
    bool isPossible(vector<int>& nums) {
        unordered_map<int, int> numsCntMap;//numsCntMap[num]表示的是num剩餘的個數
        unordered_map<int, int> numsEndCntMap;//numsEndCntMap[num]表示的時以num結尾的連續子序列(長度不小於3)個數
        //統計各個元素出現的次數
        for (auto num : nums){
            numsCntMap[num] += 1;
        }
        //開始訪問各個元素
        for (auto num : nums){
            if (numsCntMap[num] == 0){//此元素沒有剩餘,已經被使用完了
                continue;
            }
            numsCntMap[num] -= 1;//剩餘個數自減
            if (numsEndCntMap.count(num - 1) && numsEndCntMap[num - 1] > 0){
                //存在以 num - 1 結尾的連續子序列(長度不小於3),則將num放入
                numsEndCntMap[num - 1] -= 1;//以num - 1結尾的連續子序列(長度不小於3)自減,因為被num放入使用了一個
                numsEndCntMap[num] += 1;//以num結尾的連續子序列(長度不小於3)自增,剛剛建立了一個
            } else if (numsCntMap.count(num + 1) && numsCntMap[num + 1] && numsCntMap.count(num + 2) && numsCntMap[num + 2]){
                //否則查詢後面兩個元素,湊出一個合法的序列
                numsCntMap[num + 1] -= 1;
                numsCntMap[num + 2] -= 1;
                numsEndCntMap[num + 2] += 1;
            } else {
                //兩種方法都不行,則湊不出,比如[1,2,3,4,4,5]中的第二個4,
                return false;
            }
        }
        return true;
    }
}; // greedy