题目描述:
给你一个 非递减 的正整数数组 nums 和整数 K,判断该数组是否可以被分成一个或几个 长度至少 为 K 的 不相交的递增子序列。
示例 1:
输入:nums = [1,2,2,3,3,4,4], K = 3
输出:true
解释:
该数组可以分成两个子序列 [1,2,3,4] 和 [2,3,4],每个子序列的长度都至少是 3。
示例 2:
输入:nums = [5,6,6,7,8], K = 3
输出:false
解释:
没有办法根据条件来划分数组。
提示:
1 <= nums.length <= 10^5
1 <= K <= nums.length
1 <= nums[i] <= 10^5
这道题看起来有点复杂,但是你仔细一想其实不复杂,首先如果是满足条件的,那么我们必须至少分割多少个子序列呢?那么就应该是这里面出现次数最多的那个次数,只有这样才能满足不想交,其次是每个子序列至少K个,那么我们每次循环放入,这样就可以避免了某一个序列很多而另一个没有达到K,因为是循环放入,并且个数为K因此始终不会有一个序列中有重复数的情况
代码:
class Solution {
public boolean canDivideIntoSubsequences(int[] nums, int K) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int max = 0;
for (int i : nums) {
int time = map.getOrDefault(i, 0);
map.put(i, time + 1);
max = Math.max(max, time + 1);
}
// 初始化这么多
List<List<Integer>> list = new ArrayList<>(max);
for (int i = 0; i < max; i++) {
list.add(new ArrayList<>());
}
int index = 0;
for (int i = 0; i < nums.length; i++) {
int tem = nums[i];
List<Integer> temlist = list.get(index);
temlist.add(tem);
index = (index + 1) % max;
}
System.out.println(list);
for (List<Integer> list2 : list) {
if(list2.size() < K){
return false;
}
}
return true;
}
}