C ++中的直线之手

假设Rima有一张纸牌,以整数数组形式给出。现在,她希望将卡片随机分组,以使每个分组的大小为W,并由W个连续的卡片组成。我们必须检查是否可行。

因此,如果纸牌为[1,2,3,6,2,3,4,7,8],并且W = 3,那么答案将是正确的,因为她可以像[1,2,3]那样重新排列它们,[2,3,4],[6,7,8]

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个映射m,并将每个元素的频率存储到m中

  • 手的大小不为0时

    • 当它的值为0时,它==指向下一个对

    • 如果i> 0并输入键– 1 = prev或i = 0,则

    • 否则返回假

    • 它:=指向下一对

    • 将其值减1

    • 上一个:=它的关键

    • 上一页:= 0

    • it:=指向m中的第一个键值对的指针

    • 对于i,范围为0至W – 1

    • n:= n – W

    • 返回true。

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       bool isNStraightHand(vector<int>& hand, int W) {
          map <int, int> m;
          int n = hand.size();
          if(n % W != 0) return false;
          for(int i = 0; i < n; i++){
             m[hand[i]]++;
          }
          while(n){
             map <int, int> :: iterator it = m.begin();
             int prev = 0;
             for(int i = 0; i < W; i++){
                while(it->second == 0) it++;
                if((i > 0 && it->first - 1 == prev) || i == 0){
                   it->second--;
                   prev = it->first;
                }else{
                   return false;
                }
                it++;
             }
             n -= W;
          }
          return true;
       }
    };
    main(){
       vector<int> v = {1,2,3,6,2,3,4,7,8};
       Solution ob;
       cout << (ob.isNStraightHand(v, 3));
    }

    输入值

    [1,2,3,6,2,3,4,7,8]
    3

    输出结果

    1