假设我们有一个数字列表,称为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