TopK问题(优先队列):
例如下面这道题就有两种解法:
给定 100 亿个数字, 找出其中前 1000 大的数字
1. 用一个数组保存刚才的数字, 直接在这个数组上建一个大堆, 循环 1000 次进行取栈顶元素 + 调整操作, 得到前 1000 大(要考虑内存)
2. 先取集合中的前 1000 个数字, 构成一个小堆(堆顶元素就是前 1000 大元素的守门员). 再一个一个遍历集合中的数字,
依次和守门员进行比较, 遇到大于守门员的元素, 就把守门员删掉, 把这个元素入堆, 并且调整堆
当所有元素都遍历完成后, 堆中的元素就是前 1000 大的元素
例题:
题目描述:
给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。
找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。
示例:
输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
思路:
思路(采用第一种方法):
1. 获取到所有的数对
2. 把数对放到优先队列里
3. 从优先队列里取前 k 个即可
代码实现:
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
class Pair implements Comparable<Pair>{
public int n1;