373_查找和最小的K对数字
373_查找和最小的K对数字
package 队列.优先级队列; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.PriorityQueue; /** * https://leetcode-cn.com/problems/find-k-pairs-with-smallest-sums/ * @author Huangyujun * *题意:两个以升序排列的整数数组 nums1 和 nums2 【 数据对:一个来自nums1,一个来自num2 】 *方法1:使用 优先队列【大根堆】:每次都扔掉大根堆的堆顶,剩下的就是最小的数据组了 *方式2:替换堆顶法(差不多) * *这题难点在于数据结构的把握上,思路跟之前大同小异【上面方法1、方法2就是思路啦】: * 优先队列的设计:【大根堆/小根堆[怎么存储数据]~~~与接口所求一致:】 * public class _347_前K个高频元素 { ① public int[] topKFrequent(int[] nums, int k) { PriorityQueue<int[]> queue 。。。 } public class _373_查找和最小的K对数字 { ② public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) { PriorityQueue<List<Integer>> queue 。。。 } */ public class _373_查找和最小的K对数字 { public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) { int len1 = nums1.length; int len2 = nums2.length; if(len1 < 0 || len2 < 0 || k < 0) return null; //大根堆[怎么存储数据]~~~与接口所求一致: //例如题目: PriorityQueue<List<Integer>> queue = new PriorityQueue<>(k, (o1, o2)->{ return (o2.get(0) + o2.get(1)) - (o1.get(0) + o1.get(1)); }); return null; } class Solution { public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) { PriorityQueue<List<Integer>> queue = new PriorityQueue<>(k, (o1, o2)->{ return (o2.get(0) + o2.get(1)) - (o1.get(0) + o1.get(1)); }); //取最小值是为了防止两个数组一个比较少的时候【1】 【1,2,3】 for(int i = 0; i < Math.min(nums1.length, k); i++){ for(int j = 0; j < Math.min(nums2.length, k); j++){ if(queue.size() < k) { List<Integer> pair = new ArrayList<>(); pair.add(nums1[i]); pair.add(nums2[j]); queue.add(pair); }else { int top = queue.peek().get(0) + queue.peek().get(1); //大于K就出队列 if(top > nums1[i]+nums2[j]){ List<Integer> pair = new ArrayList<>(); queue.poll(); pair.add(nums1[i]); pair.add(nums2[j]); queue.add(pair); } } } } List<List<Integer>> res = new LinkedList<>(); for(int i =0; i < k && !queue.isEmpty(); i++){ res.add(queue.poll()); } return res; } } }
本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15709173.html