题目

https://leetcode.com/problems/find-k-pairs-with-smallest-sums/

题解

本来以为是个双指针+贪心,但是后来发现如果用双指针的话,指针并不是只能++,还需要往回走,否则会丢失一些组合

看了 Related Topics 之后才发现,这是个考察 Heap 的题。

相关问题:leetcode 347. Top K Frequent Elements | 347. 前 K 个高频元素(大根堆)

于是复制之前的模板,建了个小根堆,搞定。

class Solution {public static class HeapNode {int sum;int n1;int n2;public HeapNode(int n1, int n2) {this.n1 = n1;this.n2 = n2;this.sum = n1 + n2;}}public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {List<List<Integer>> result = new ArrayList<>();int heapSize = nums1.length * nums2.length;HeapNode[] heap = new HeapNode[heapSize];// 建小根堆int p = 0;for (int n1 : nums1) {for (int n2 : nums2) {heap[p++] = new HeapNode(n1, n2);}}for (int i = heapSize - 1; i >= 0; i--) // 自下向上建堆 可证复杂度为O(n)heapify(heap, i, heapSize);// Top kfor (int i = 0; i < k && i < heap.length; i++) {ArrayList<Integer> pair = new ArrayList<>();pair.add(heap[0].n1);pair.add(heap[0].n2);result.add(pair);// 堆调整swap(heap, 0, --heapSize);heapify(heap, 0, heapSize);}return result;}public void heapify(HeapNode[] heap, int i, int size) {int left = i * 2 + 1;while (left < size) {int mini = left + 1 < size && heap[left + 1].sum < heap[left].sum ? left + 1 : left; // 左右孩子较小者的下标mini = heap[mini].sum < heap[i].sum ? mini : i; // 两个孩子与父节点较小者的下标if (mini == i) break; // 不需要交换的情况swap(heap, mini, i);i = mini; // 更新i使其下沉left = 2 * i + 1;}}private void swap(HeapNode[] heap, int i, int j) {HeapNode tmp = heap[i];heap[i] = heap[j];heap[j] = tmp;}
}

leetcode 373. Find K Pairs with Smallest Sums | 373. 查找和最小的K对数字(小根堆)相关推荐

  1. 373. Find K Pairs with Smallest Sums (java,优先队列)

    题目: You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Def ...

  2. 373. Find K Pairs with Smallest Sums 找出求和和最小的k组数

    [抄题]: You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. D ...

  3. LeetCode Find K Pairs with Smallest Sums(大根堆、小根堆)

    问题:给出两个有序数组nums1,nums2,要求从两个数组中各取一个数,组成一对数据,输出和最小的k对 思路:方法1使用大根堆,当堆中元素个数小于k时,直接入堆.否则比较当前数据对与堆顶的元素,如果 ...

  4. [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  5. ⭐算法入门⭐《堆》中等03 —— LeetCode 373. 查找和最小的K对数字

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给定两个以升序排列的整 ...

  6. Java实现 LeetCode 373 查找和最小的K对数字

    373. 查找和最小的K对数字 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找 ...

  7. LeetCode 373. 查找和最小的K对数字(自定义优先队列BFS)

    1. 题目 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找到和最小的 k 对数 ...

  8. Leetcode 373. 查找和最小的K对数字 解题思路及C++实现

    解题思路: 使用最大堆来存储k个和最小的数组组合,然后每进来一个数组组合,只需要和最大堆的堆顶进行比较即可. 用C++的priority_queue实现最大堆时,需要用一下pair来组合来自nums1 ...

  9. 力扣 373. 查找和最小的K对数字

    题目 给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k . 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 . 请找到和最小的 k ...

最新文章

  1. mysql gtid 开启失败,master--1.1.3-SNAPSHOT版本,启用GTID,启动失败
  2. 计算机组成的基本硬件设备
  3. html中用来标记关键字的标识,简单的HTML标识属性与识别
  4. python金字塔图绘制_如何用R或Python绘制3d(4变量)三元(金字塔)图?
  5. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例
  6. 选择结构_单if语句
  7. 2016年工作总结和计划
  8. gradle构建_指定Gradle构建属性
  9. 【Java】浅显理解 hashcode 和 hash 算法
  10. python机器学习案例系列教程——逻辑分类/逻辑回归LR/一般线性回归(softmax回归)
  11. 从C#开发人员到Windows Phone 7高级开发人员只需3周 – 序
  12. Python学习之——列表、字典、实验低配版非诚勿扰
  13. 领导力包括哪些能力?如何提升领导力?
  14. java七牛云图片压缩_七牛云 CDN 历史图片批量压缩
  15. 全球5G设备商最新排名
  16. js图片轮播效果实现代码
  17. 什么是软件需求?软件需求是什么意思?
  18. 编写程序,输入本金、年利率和年份,计算复利(结果保留2位小数)
  19. ubuntu保存退出
  20. 多个独立索引和联合索引的选择

热门文章

  1. CodeForces - 1350D Orac and Medians(思维)
  2. uva1616二分加误差处理
  3. Keras-训练可视化
  4. 排序算法-06堆排序(python实现)
  5. 针对某游戏保护DebugPort清零的一次逆向
  6. Shell变量:Shell变量的定义、删除变量、只读变量、变量类型
  7. 关于UAC执行级别的研究
  8. 在 Android 中使用 OpenGL
  9. 第34讲:更好用的自动化工具 airtest 的使用
  10. python中的线程threading.Thread()使用