首先统计有多少个可以抵牌的赖子(可以当任何一张其它牌使用)
然后统计Max减Min是否超过了所有的牌,毕竟如果这样的话,即使全是赖子都不能使用
将所有的牌按照所在值减Min排列起来,如果存在设为true。如果不存在则使用赖子抵用,当来自使用完了之后,则说明不可以构成顺子
代码如下:
#include<iostream> #include<vector> using namespace std; class Solution { public: bool IsContinuous( vector<int> numbers ) { int luckyCount = 0; vector<bool> tag; //tag.reserve(numbers.size()); int minNumber = 1<<30; int maxNumber = 0; for (int i = 0; i < numbers.size(); i++) { if (numbers[i] == 0) { luckyCount++; } else { if (numbers[i] < minNumber) { minNumber = numbers[i]; } if (numbers[i] > maxNumber) { maxNumber = numbers[i]; } } tag.push_back(false); } /* *确保最大的数字也能够放进数组里 */ if (maxNumber - minNumber + 1 > tag.size()) { return false; } for (int i = 0; i < numbers.size(); i++) { if (numbers[i] != 0) { //numbers[i]可能是一个很大的数,超过了tag的size tag[numbers[i] - minNumber] = true; } } for (int i = 0; i < tag.size();i++) { if (!tag[i]) { luckyCount--; } if (luckyCount < 0) { return false; } } return true; } }; int main() { int array[] = {3,0,0,0,0}; vector<int> vec(array, array + sizeof(array)/sizeof(int)); cout<<Solution().IsContinuous(vec); return 0; }