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