373. Find K Pairs with Smallest Sums

2024-05-09 05:32
文章标签 find 373 smallest pairs sums

本文主要是介绍373. Find K Pairs with Smallest Sums,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:输入两个整形升序数组,整数k,要求分别从2个数组中取出2个数组成对,输出和最小的k个对。

思路:1 参考leetcode discuss;

   2  PriorityQueue实现最小堆,具体步骤如下:

初始化为array1中的前k个元素(注意,如果array1中的长度小于k,则为array1.length)和array2中的首个元素组成的pair;

每次从堆中剔除首个元素p(即目前堆中pair的和最小),然后将p中对应array2的下标后移(注意后移之前判断是否到达array2的边界),把<(int[2])p[0], p[1]=nums2[index+1]>添加到堆中。

时间复杂度为 O(klogk)。因为堆中的元素最多k个。


public class Solution {
class Pair{
int[] pair;
int idx; //numArry2[curIndex]
long sum;
public Pair(int idx, int n1, int n2) {
super();
this.idx = idx; //note current searched index of array2
pair = new int[]{n1, n2};
sum = (long)n1 + n2;
}
}
class ComPair implements Comparator{
public int compare(Pair o1, Pair o2) {
return Long.compare(o1.sum, o2.sum); //o1.sum - o2.sum
}
}
public ListkSmallestPairs(int[] nums1, int[] nums2, int k){
Listret = new ArrayList<>();
if(nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0){
return ret;
}
PriorityQueueq = new PriorityQueue<>(k, new ComPair());
for(int i = 0; i < nums1.length && i < k; i++){
q.offer(new Pair(0, nums1[i], nums2[0])); //klogk
}
for(int i = 0; i < k && !q.isEmpty(); i++){
Pair p = q.poll(); //remove head of the queue O(logk)
ret.add(p.pair);
if(p.idx < nums2.length-1){
q.offer(new Pair(p.idx+1, p.pair[0], nums2[p.idx+1]));
}
}
return ret;
}
}

这篇关于373. Find K Pairs with Smallest Sums的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972512

相关文章

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

MongoDB学习—(6)MongoDB的find查询比较符

首先,先通过以下函数向BookList集合中插入10000条数据 function insertN(obj,n){var i=0;while(i<n){obj.insert({id:i,name:"bookNumber"+i,publishTime:i+2000})i++;}}var BookList=db.getCollection("BookList")调用函数,这样,BookList

【uva】11536-Smallest Sub-Array(区间移动问题)

一个区间移动的问题,1A了,感觉没什么好说的。。 13975926 11536 Smallest Sub-Array Accepted C++ 0.809 2014-08-01 11:00:20 #include<cstdio>#include<cstring>#include<iostream>using namespace std;#define INF 1 << 30

【NodeJS】Error: Cannot find module 'ms'

转载自:http://blog.csdn.net/echo_ae/article/details/75097004 问题: Error: Cannot find module 'ms'at Function.Module._resolveFilename (module.js:469:15)at Function.Module._load (module.js:417:25)at Module

leetCode#448. Find All Numbers Disappeared in an Array

Description Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. Find all the elements of [1, n] inclusive that do not appear in this

访问controller404:The origin server did not find a current representation for the target resource

ider build->rebuild project。Rebuild:对选定的目标(Project),进行强制性编译,不管目标是否是被修改过。由于 Rebuild 的目标只有 Project,所以 Rebuild 每次花的时间会比较长。 参考:资料

mybatis错误——java.io.IOException Could not find resource comxxxxxxMapper.xml

在学习Mybatis的时候,参考网上的教程进行简单demo的搭建,配置的没有问题,然后出现了下面的错误! Exception in thread "main" java.lang.RuntimeException: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause:

Linux 中的 find 命令介绍以及使用

文章目录 Linux 中的 `find` 命令详解及使用示例`find` 命令的基本语法常用的 `find` 命令选项按文件名搜索:`-name`按文件类型搜索:`-type`按文件大小搜索:`-size`按修改时间搜索:`-mtime`按权限搜索:`-perm`按所有者搜索:`-user` 和 `-group` `find` 命令的常见操作删除找到的文件:`-exec` 和 `rm`查找并

mysql中find_in_set()函数

1.场景 假设有一个user用户表,表字段分别为:id(主键),name(姓名),age(年龄),hobby(爱好)。而一个人可能有好几个爱好,游泳啊篮球啊乒乓球啊等等。数据库里hobby字段存的是:游泳,篮球,乒乓球 而要想查所有喜欢游泳的人,就可以用find_in_set函数了 todo:贴图 2.使用 select *from user where find_in_set("游泳"

Failed to find style 'vpiCirclePageIndicatorStyle' in current theme

使用 ViewPagerIndicator 时 , 布局文件报的错 Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layout to choose a different layout, or fix the theme style refe