給出五張牌,判斷是不是順子,大小王再數組中認為是0,可以當任何牌。
看似是要排序之後判斷是不是順子,實際上可以完全從順子的定義入手,去判斷這組數字可否成為順子。
五個數可否成為順子的條件:1、最大值與最小值內插補點不大于5(因為有大小王的規則,不能嚴格定義成最大值與最小值內插補點為4);2、不能有重複的數字;3、撲克牌最小是1,最大是13;
隻要一個數組滿足這三個條件,則一定是順子,這樣就可以的時間複雜度為n的情況下判斷出來了。代碼如下:
class Solution {
public:
bool IsContinuous( vector<int> num ) {
if(num.size()!=5) return false;
int max=-1,min=14;
int i,count=0,flag=0;
for(i=0;i<5;i++){
if(num[i]>13 || num[i]<0) return false;
if(num[i] == 0) continue; //這裡要注意,如果為0則是任意牌,就不用進行下面的判斷了
if(max<num[i]) max=num[i]; //記錄最大最小值
if(min>num[i]) min=num[i];
if(flag&(1<<num[i])) return false; //利用bitmap來判斷有無相同數字
flag|=1<<num[i]; //利用bitmap存儲已經出現的數字
if(max-min>=5) return false;
}
return true;
}
};