本文介绍: 原题:力扣215.之间用快速排序做过这道题,这次使用堆查找。找最大用小堆,找最小用大堆,找中间用两个堆。这道题用小堆,新元素插入的时候就替换根元素,然后重新构造小堆,构造完成后的根元素就是第 K 大的元素,不论要处理的元素有多少以及是否固定,小堆的长度都固定为 K ,且根元素就是第 K 大的元素。只有比根元素大的才让进入堆。这里使用 PriorityQueue 优先队列。
1.在数组中找第 K 大的元素
原题:力扣215.
之间用快速排序做过这道题,这次使用堆查找。
找最大用小堆,找最小用大堆,找中间用两个堆。
这道题用小堆,新元素插入的时候就替换根元素,然后重新构造小堆,构造完成后的根元素就是第 K 大的元素,不论要处理的元素有多少以及是否固定,小堆的长度都固定为 K ,且根元素就是第 K 大的元素。
只有比根元素大的才让进入堆。
这里使用 PriorityQueue 优先队列。
public class Solution {
public int findKthLargest(int[] nums, int k) {
if (k > nums.length) {
return -1;
}
int len = nums.length;
// 大小为 k ,排序规则为降序
PriorityQueue<Integer> minHeap = new PriorityQueue<>(k, (a, b) -> a - b);
for (int i = 0; i < k; i++) {
minHeap.add(nums[i]);
}
for (int i = k; i < len; i++) {
Integer topEle = minHeap.peek();
if (nums[i] > topEle) {
minHeap.poll();
minHeap.offer(nums[i);
}
}
return minHeap.peek();
}
}
2.合并 K 个排序链表
原题:力扣23.
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) {
return null;
}
PriorityQueue<ListNode> q = new PriorityQueue<>(Comparator.comparing(node -> node.val));
for (int i = 0; i < lists.length; i++) {
if (lists[i] != null) {
q.add(lists[i]);
}
}
ListNode dummy = new ListNode(0);
ListNode tail = dummy;
while (!q.isEmpty()) {
tail.next = q.poll();
tail = tail.next;
if (tail.next != null) {
q.add(tail.next);
}
}
return dummy.next;
}
如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤
个人主页:星不易 ❤
算法通关村专栏:不易|算法通关村 ❤
原文地址:https://blog.csdn.net/m0_57130776/article/details/134823808
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_51119.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。