(最简单但是不易理解)方法三:
public static void main(String[] args) {
//lambda表达式,java8之后才有的新东西,相当于一个匿名方法
//代码省略太多以至于不好理解,但是实现方便
//三种方式分别逐步进行简便理解
//1
PriorityQueue pQ = new PriorityQueue<>((Integer o1, Integer o2) -> {
return o2 - o1;
});
//2
PriorityQueue pQ1 = new PriorityQueue<>((Integer o1, Integer o2) -> o2 - o1);
//3
PriorityQueue pQ2 = new PriorityQueue<>(( o1, o2) -> o2 - o1);
pQ2.offer(4);
pQ2.offer(0);
pQ2.offer(3);
pQ2.offer(8);
pQ2.offer(5);
//库的优先队列是小堆,我们将其变为大堆
while (!pQ2.isEmpty()) {
System.out.print(pQ2.poll() + " ");
}
}
运行结果:
8 5 4 3 0
TopK问题:
**今天我们主要说TopK中的其中一种解决思想,一会有机会介绍第二种。
我们知道如果建立的优先级队列的是基于大堆,那么我们首次出队列出的值必定是最大值,第二次出的便是第二大,以此类推就解决了TopK问题。**
习题:
**给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。
找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-k-pairs-with-smallest-sums
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。**
解题思想:
-
建立一个静态内部类,类里有属性num1与num2和sum,并在构造犯法里计算出sum的和。
-
创建优先级队列,需要重写compare方法将大小改为sum的大小建立小堆。
-
foreach遍历俩个数组nums1与nums2,将俩个数组里的元素进行建堆,然后入队列。
-
最后需要K个数字对,我们就出K次队列创建链表,入链表。
代码如下:
class Solution {
static class sumNums {
public int num1;
public int num2;
public int sum;
public sumNums(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
this.sum = num1 + num2;
}
}
public List<List> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List> result = new ArrayList<>();
if(k <= 0) {
return result;
}
PriorityQueue pQ = new PriorityQueue<>((o1, o2) -> o1.sum - o2.sum);
for(int num1 : nums1) {
for(int num2 : nums2) {
pQ.offer(new sumNums(num1, num2));
}
}
for(int i = k; i > 0; i --) {
sumNums ret = pQ.poll();
if(ret == null) {
continue;
}
List list = new ArrayList<>();
list.add(ret.num1);
list.add(ret.num2);
result.add(list);
}
return result;
}
}
**有一堆石头,每块石头的重量都是正整数。
每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
如果 x == y,那么两块石头都会被完全粉碎;
如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/last-stone-weight
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。**
解题思想:
-
建立优先级队列,并改为大堆,遍历数组入队列。
-
进入while循环,循环结束条件是size > 1.
-
每次出队列俩个元素,一定是最大的俩个,让x为第二大,然后进行if处理。
-
当循环结束,如果size为0那么return 0,如果size为1就return队列这个值。
代码如下:
最后
由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。
本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
分布式缓存**等等知识详解。
[外链图片转存中…(img-RW4qtt3N-1714330458590)]
本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
[外链图片转存中…(img-LGmcP0V4-1714330458591)]
[外链图片转存中…(img-Vf3qrOcJ-1714330458591)]