leetcode 373. Find K Pairs with Smallest Sums | 373. 查找和最小的K对数字(小根堆)
题目
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对数字(小根堆)相关推荐
- 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 ...
- 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 ...
- LeetCode Find K Pairs with Smallest Sums(大根堆、小根堆)
问题:给出两个有序数组nums1,nums2,要求从两个数组中各取一个数,组成一对数据,输出和最小的k对 思路:方法1使用大根堆,当堆中元素个数小于k时,直接入堆.否则比较当前数据对与堆顶的元素,如果 ...
- [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- ⭐算法入门⭐《堆》中等03 —— LeetCode 373. 查找和最小的K对数字
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 给定两个以升序排列的整 ...
- Java实现 LeetCode 373 查找和最小的K对数字
373. 查找和最小的K对数字 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找 ...
- LeetCode 373. 查找和最小的K对数字(自定义优先队列BFS)
1. 题目 给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k. 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2. 找到和最小的 k 对数 ...
- Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
解题思路: 使用最大堆来存储k个和最小的数组组合,然后每进来一个数组组合,只需要和最大堆的堆顶进行比较即可. 用C++的priority_queue实现最大堆时,需要用一下pair来组合来自nums1 ...
- 力扣 373. 查找和最小的K对数字
题目 给定两个以 升序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k . 定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 . 请找到和最小的 k ...
最新文章
- mysql gtid 开启失败,master--1.1.3-SNAPSHOT版本,启用GTID,启动失败
- 计算机组成的基本硬件设备
- html中用来标记关键字的标识,简单的HTML标识属性与识别
- python金字塔图绘制_如何用R或Python绘制3d(4变量)三元(金字塔)图?
- IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例
- 选择结构_单if语句
- 2016年工作总结和计划
- gradle构建_指定Gradle构建属性
- 【Java】浅显理解 hashcode 和 hash 算法
- python机器学习案例系列教程——逻辑分类/逻辑回归LR/一般线性回归(softmax回归)
- 从C#开发人员到Windows Phone 7高级开发人员只需3周 – 序
- Python学习之——列表、字典、实验低配版非诚勿扰
- 领导力包括哪些能力?如何提升领导力?
- java七牛云图片压缩_七牛云 CDN 历史图片批量压缩
- 全球5G设备商最新排名
- js图片轮播效果实现代码
- 什么是软件需求?软件需求是什么意思?
- 编写程序,输入本金、年利率和年份,计算复利(结果保留2位小数)
- ubuntu保存退出
- 多个独立索引和联合索引的选择