AdamDuncan

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

首先统计有多少个可以抵牌的赖子(可以当任何一张其它牌使用)

然后统计Max减Min是否超过了所有的牌,毕竟如果这样的话,即使全是赖子都不能使用

将所有的牌按照所在值减Min排列起来,如果存在设为true。如果不存在则使用赖子抵用,当来自使用完了之后,则说明不可以构成顺子

代码如下:

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        int luckyCount = 0;
        vector<bool> tag;
        //tag.reserve(numbers.size());
        int minNumber = 1<<30;
        int maxNumber = 0;
        for (int i = 0; i < numbers.size(); i++)
        {
                if (numbers[i] == 0)
                {
                    luckyCount++;
                } else {
                     if (numbers[i] < minNumber)
                     {
                           minNumber = numbers[i];
                     }
                     if (numbers[i] > maxNumber) {
                        maxNumber = numbers[i];
                        }
                } 
                tag.push_back(false);
        }
        /*
        *确保最大的数字也能够放进数组里 
        */
        if (maxNumber - minNumber + 1 > tag.size())
        {
            return false;
        }
        for (int i = 0; i < numbers.size(); i++)
        {
            if (numbers[i] != 0)
            {
                //numbers[i]可能是一个很大的数,超过了tag的size
                tag[numbers[i] - minNumber] = true; 
            }  
        }
        for (int i = 0; i < tag.size();i++)
        {
            if (!tag[i])
            {
                luckyCount--;
            }
            if (luckyCount < 0)
            {
                return false;
            }
        }
        return true;
    }
};
int main()
{
    int array[] = {3,0,0,0,0};
    vector<int> vec(array, array + sizeof(array)/sizeof(int));
    cout<<Solution().IsContinuous(vec);
    return 0;
}

 

posted on 2017-12-09 14:11  AdamDuncan  阅读(1086)  评论(0编辑  收藏  举报