欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 846 一首顺子

程序员文章站 2024-01-20 21:42:46
...

爱丽丝有一手(hand)由整数数组给定的牌。 

现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成。

如果她可以完成分组就返回 true,否则返回 false

 

示例 1:

输入:hand = [1,2,3,6,2,3,4,7,8], W = 3
输出:true
解释:爱丽丝的手牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。

示例 2:

输入:hand = [1,2,3,4,5], W = 4
输出:false
解释:爱丽丝的手牌无法被重新排列成几个大小为 4 的组。

 

提示:

  1. 1 <= hand.length <= 10000
  2. 0 <= hand[i] <= 10^9
  3. 1 <= W <= hand.length

 

 

我们将数放到map里,并计数,由于map是自动从小到大排序的,从最小的开始,我们假设它是一组牌的第一张牌,然后再看它后面的W-1张牌是否顺序,不是返回false,这里利用了c++的一个特性,如果map的key没有定义,我们去访问它不会报错而是新增一个key值为0。假设当前第一个值为i,我们需要把i—i+W-1内值的数量减一,如果没有值默认为0,减一后小于0说明不连续返回false。

class Solution {
public:
       bool isNStraightHand(vector<int> hand, int W) {
        map<int, int> c;
        for (int i : hand) c[i]++;
        for (auto it : c)
            if (c[it.first] > 0)
                for (int i = W - 1; i >= 0; --i)
                    if ((c[it.first + i] -= c[it.first]) < 0)
                        return false;
        return true;
    } 
};