LeetCode-846
阿新 • • 發佈:2018-12-12
uniq -o for -s 分組 leet 提交 大小 lee https://leetcode-cn.com/problems/hand-of-straights/submissions/
愛麗絲有一手(hand)由整數數組給定的牌。
愛麗絲有一手(hand)由整數數組給定的牌。
現在她想把牌重新排列成組,使得每個組的大小都是 W,且由 W 張連續的牌組成。
如果她可以完成分組就返回 true,否則返回 false。
示例 1:
輸入:hand = [1,2,3,6,2,3,4,7,8], W = 3
輸出:true
解釋:愛麗絲的手牌可以被重新排列為 [1,2,3],[2,3,4],[6,7,8]。
示例 2:
輸入:hand = [1,2,3,4,5], W = 4
輸出:false
解釋:愛麗絲的手牌無法被重新排列成幾個大小為 4 的組。
提示:
1 <= hand.length <= 10000
0 <= hand[i] <= 10^9
1 <= W <= hand.length
算法很low,先用map紀錄各個數字的次數
然後從頭開始便利看哪個數字還沒消耗完就從哪個數字開始 期間如果有連續中斷的直接返回false;
這裏優化了下 每次有數字減少到0就紀錄 下次便利的時候就從這裏開始
class Solution { public: bool isNStraightHand(vector<int>& hand, int W) { int A = 0; int len = hand.size(); map<int, int> B; if ((len / (W ))*W != len) { return false; } for (A = 0; A < hand.size(); A++) { B[hand[A]]++; } vector<int> z = hand; int las = -1; int Nz = 0; int lsmix = 0; sort(z.begin(), z.end()); z.erase(unique(z.begin(), z.end()), z.end()); while (1) { Nz = 0; for (A = lsmix; ; A++) { int numsz = z[A]; int lef = B[numsz]; if (lef > 0 ) { if (las == -1) { las = numsz; B[numsz]--; Nz++; } else { if (las + 1 != numsz) { return false; } else { B[numsz]--; Nz++; las = numsz; } } //cout << numsz << " "; } else if (lef == 0) { if (lsmix >= A) lsmix = A+1; } if (Nz == W) break; } if (B[z[z.size() - 1]] == 0) { break; } if (A == z.size() && Nz!=W) { return false; } //cout << endl; las = -1; } return true; } };
執行用時: 88 ms, 在Hand of Straights的C++提交中擊敗了34.27% 的用戶
時間還是很慢
LeetCode-846