class Solution {
public boolean isPossibleDivide(int[] nums, int k) {
int len = nums.length;
if (len % k != 0) {
return false;
}
PriorityQueue<Integer> minHeap = new PriorityQueue<>(len);
for (int num : nums) {
minHeap.offer(num);
}
while (!minHeap.isEmpty()) {
Integer top = minHeap.poll();
for (int i = 1; i < k; i++) {
// 从 1 开始,正好需要移除 k - 1 个元素
// i 正好就是相对于 top 的偏移
if (!minHeap.remove(top + i)) {
// 如果移除失败,说明划分不存在,直接返回 false 即可
return false;
}
}
}
return true;
}
}
这是一道周赛题
题意是说判断一个数组中的元素能否按大小顺序以k个为单位划分为集合
最好的做法就是使用优先队列构建最小堆
因为最小堆每次都会弹出最小的数字,根据这个数字进一步在堆中删除题目要求的数字。如果删除失败说明不符合题意,如果最终最小堆完全删除则成功。
这里需要注意一下java中优先队列的api。offer()等价于add(),remove()删除的是指定元素而不是根据index删除,而且返回bool值表明是否删除成功。