程序,用于检查列表是否可以拆分为C ++中k个递增元素的子列表

假设我们有一个数字列表,称为nums,另一个数字为k,我们必须检查该列表是否可以拆分为列表,其中每个列表包含k个值,并且这些值连续增加。

因此,如果输入类似于nums = [4,3,2,4,4,5,6],k = 3,则输出将为True,因为我们可以将列表分为[2,3,4]和[ 4,5,6]

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

  • 定义一张映射

  • 对于每一个键

    • 使m [it]增加1

  • 好的:=真

  • 而(m的大小不为0且ok为true),则执行-

    • 如果(it.key-1)不在m中,则-

    • 对于初始化i:= it.key,当我<= it.key + k-1,更新(将i增加1),执行-

    • 好的:=真

    • 从循环中出来

    • 从m中删除我

    • (将m [i]减少1)

    • 如果m [i]等于0,则-

    • 如果i不存在于m中,则-

    • 标志:=假

    • 标志:= true

    • 对于初始化i:= it.key,当i <= it.key + k-1,更新(i增加1),执行-

    • 如果flag为true,则-

    • 好的:=假

    • 对于每个键值对,以m为单位

    • 当m为空时返回true,否则返回false。

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

    示例

    #include<bits/stdc++.h>
    using namespace std;
    class Solution {
       public:
          bool solve(vector<int> nums, int k) {
             map <int, int> m;
             for(auto& it : nums){
                m[it]++;
             }
             bool ok = true;
             while(m.size() && ok){
                ok = false;
                for(auto& it : m){
                   if(!m.count(it.first - 1)){
                      bool flag = true;
                      for(int i = it.first; i <= it.first + k - 1;i++){
                         if(!m.count(i))
                            flag = false;
                         }
                         if(flag){
                            for(int i = it.first; i <= it.first + k - 1;i++){
                               m[i]--;
                               if(m[i] == 0)
                                  m.erase(i);
    
                         }
                         ok = true;
                         break;
                      }
                   }
                }
             }
             return m.empty();
          }
    };
    main(){
       vector<int> v = {4, 3, 2, 4, 5, 6};
       Solution ob;
       cout << ob.solve(v, 3);
    }

    输入值

    {4, 3, 2, 4, 5, 6}

    输出结果

    1