659. 分割陣列為連續子序列
阿新 • • 發佈:2020-12-04
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