先排序,然后遍历该数组,计算大小王个数。然后再次遍历,判断连续两个数字是否有相同的,如果有就直接false。如果不同就将flag - (后一个数字-前一个数字-1),比如1,2,flag减去的就是0,就是不消耗大小王。如果是1,3那么flag-1,就是要消耗掉一个大小王。最后判断flag是否小于0,如果小于0,就是false
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
//用set也可以,如果除0外的数字有重复,直接false
//不用set的话就要排序,不然计算是否有重复就是O(n^2)了
if(numbers.size() < 5) return false;
int flag = 0;
//记录大小王个数,也就是0的个数,然后记录最小值和最大值,从最小值遍历到最大值
//如果有个值没有,就用大小王来代替,然后大小王--
//如果这个值没有,且大小王<=0,就false
/*int maxn = INT_MIN, minn = INT_MAX;
for(int x : numbers){
//如果这样子的话,最小的值就是0了
if(x > maxn && x != 0) maxn = x;
if(x < minn && x != 0) minn = x;
if(x == 0) flag++;
}
for(int i = minn; i <= maxn; ++i){
//如果找不到这个连续的数字,就要用flag来抵消
if(find(numbers.begin(),numbers.end(),i) == numbers.end()){
if(flag > 0) flag--;
else return false;
}
}
return true;*/
sort(numbers.begin(),numbers.end());
for(int x:numbers){
if(x == 0) flag++;
}
for(int i = 0; i <numbers.size()-1; ++i){
if(numbers[i] != 0){
if(numbers[i] == numbers[i+1]) return false;
flag -= (numbers[i+1] - numbers[i]-1);
}
}
if(flag<0) return false;
return true;
}
};