天天看點

【刷題之路】撲克牌順子

給出五張牌,判斷是不是順子,大小王再數組中認為是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;

    }

};