第一种思路:1、先排序 2、统计0的个数,检查有没有其他重复的数 3、看缺的牌数是不是小于等于0的个数
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size()!=5) return false;
//1、排序
sort(numbers.begin(), numbers.end());
//2、统计0的个数和重复数字
int count = 0;
for(int i=0; i<5; i++){
if(numbers[i]==0) count++;
if((i<4) && (numbers[i]==numbers[i+1]) && (numbers[i]!=0)) return false;
}
//3、统计差的牌数
int sum = 0;
for(int j=count; j<4; j++){
sum += (numbers[j+1]-numbers[j]-1);
}
if(sum<=count) return true;
return false;
}
};
第二种思路:最大值与最小值之间差值<5,并且除0之外没有重复数字,就可保证是顺子。这种方法不需要排序。
但是需要额外的空间记录每个数字出现了几次。
bool IsContinuous( vector<int> numbers ) {
if(numbers.size()!=5) return false;
int count[14] = {0};
int max = -1;
int min = 14;
for (int i=0; i<numbers.size(); i++){
count[numbers[i]]++;
if(numbers[i] == 0) continue;
if(count[numbers[i]]>1) return false;
if(max<numbers[i]) max = numbers[i];
if(min>numbers[i]) min = numbers[i];
}
return (max-min)>=5 ? false : true;
}