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;
        }
    }



}

 

posted @ 2021-12-19 23:38  一乐乐  阅读(36)  评论(0编辑  收藏  举报