当前位置: 首页 > news >正文

剑指 Offer II 061. 和最小的 k 个数对


comments: true
edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20061.%20%E5%92%8C%E6%9C%80%E5%B0%8F%E7%9A%84%20k%20%E4%B8%AA%E6%95%B0%E5%AF%B9/README.md

剑指 Offer II 061. 和最小的 k 个数对

题目描述

给定两个以升序排列的整数数组 nums1 nums2 , 以及一个整数 k 

定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 

请找到和最小的 k 个数对 (u1,v1),  (u2,v2)  ...  (uk,vk) 。

 

示例 1:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
    [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

示例 2:

输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
     [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

示例 3:

输入: nums1 = [1,2], nums2 = [3], k = 3
输出: [1,3],[2,3]
解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]

 

提示:

  • 1 <= nums1.length, nums2.length <= 104
  • -109 <= nums1[i], nums2[i] <= 109
  • nums1, nums2 均为升序排列
  • 1 <= k <= 1000

 

注意:本题与主站 373 题相同:https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/

解法

方法一

Python3
import heapq as hp
class Solution:
    def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:
        lst=[]
        for n1 in nums1:
            for n2 in nums2:
                hp.heappush(lst,(-(n1+n2),[n1,n2])) #大顶堆
                if len(hp)>k:hp.heappop(lst)
        return [c for _,c in lst]
Java
class Solution {
    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        Queue<List<Integer>> pq = new PriorityQueue<>(
            (p1, p2) -> { return p2.get(0) + p2.get(1) - (p1.get(0) + p1.get(1)); });
        for (int i = 0; i < nums1.length && i < k; i++) {
            for (int j = 0; j < nums2.length && j < k; j++) {
                pq.offer(List.of(nums1[i], nums2[j]));
                if (pq.size() > k) {
                    pq.poll();
                }
            }
        }
        return new ArrayList<>(pq);
    }
}
C++
class Solution {
public:
    vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        using pii = pair<int, int>;
        auto cmp = [](pii p1, pii p2) { return p1.first + p1.second < p2.first + p2.second; };
        priority_queue<pii, vector<pii>, decltype(cmp)> pq(cmp);
        for (int i = 0; i < nums1.size() && i < k; ++i) {
            for (int j = 0; j < nums2.size() && j < k; ++j) {
                pq.push({nums1[i], nums2[j]});
                if (pq.size() > k) pq.pop();
            }
        }
        vector<vector<int>> ans;
        while (!pq.empty()) {
            pii p = pq.top();
            pq.pop();
            ans.push_back({p.first, p.second});
        }
        return ans;
    }
};
Go
type pairHeap [][]int

func (a pairHeap) Len() int           { return len(a) }
func (a pairHeap) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a pairHeap) Less(i, j int) bool { return a[i][0]+a[i][1] > a[j][0]+a[j][1] }
func (a *pairHeap) Push(x any)        { *a = append(*a, x.([]int)) }
func (a *pairHeap) Pop() any          { l := len(*a); tmp := (*a)[l-1]; *a = (*a)[:l-1]; return tmp }

func kSmallestPairs(nums1 []int, nums2 []int, k int) [][]int {
	var hp pairHeap
	for _, x := range nums1[:min(k, len(nums1))] {
		for _, y := range nums2[:min(k, len(nums2))] {
			heap.Push(&hp, []int{x, y})
			if len(hp) > k {
				heap.Pop(&hp)
			}
		}
	}
	return hp
}

相关文章:

  • 车载网络测试-DBC文件解读
  • 算法-回溯算法总结
  • 灰色地带规避:知识产权校验API的商标库模糊匹配算法
  • android studio开发文档
  • python从入门到精通(二十六):python文件操作之Word全攻略(基于python-docx)
  • 【JAVA架构师成长之路】【电商系统实战】第11集:秒杀系统防刷实战(验证码 + 用户行为黑名单)
  • linux声音框架alsa的api学习之wav文件解析
  • DIY Tomcat:手写一个简易Servlet容器
  • Conda常用命令汇总
  • MySQL索引数据结构
  • 深度剖析 打造大模型时代的可信AI:技术创新与安全治理并重
  • 【从零开始学习计算机科学】数字逻辑(四)数字系统设计
  • CGI程序刷新共享内存视频流到HTTP
  • Ubuntu通过局域网共享文件夹实现文件夹的连接
  • FastAPI常用的组件库
  • Android JSON与对象转换工具类:支持复杂数据结构
  • 如何在unity中完整录制一段动画
  • C# 多线程编程完全指南:从基础到高级应用
  • 物联网实时数据存储方案选择
  • 山东大学计算机科学与技术学院软件工程实验日志(更新中)
  • 静安集团网站建设/苏州百度
  • 美国网站建设公司哪家好/资源网站优化排名优化
  • 仙游哪里可以做网站的/上海短视频seo优化网站
  • 做网站最好选什么语言/游戏推广平台
  • 网站建设公司巨头/关键词搜索次数查询
  • 做企业网站一般多少钱/百度公司官网入口