leetcode-划分数组为连续数字的集合

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值表明是否删除成功。

发布了48 篇原创文章 · 获赞 0 · 访问量 4342

猜你喜欢

转载自blog.csdn.net/weixin_41327340/article/details/103723192