剑指offer——扑克牌顺子C++

在这里插入图片描述
先排序,然后遍历该数组,计算大小王个数。然后再次遍历,判断连续两个数字是否有相同的,如果有就直接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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值