• 剑指 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

    解题思路

    维护一个大小为k的大顶堆,存储数对及其和

    代码

    Python

    1. class Solution:
    2. def kSmallestPairs(self, nums1: list[int], nums2: list[int], k: int) -> list[list[int]]:
    3. a, b = len(nums1), len(nums2)
    4. k = min(k, a * b)
    5. a, b = min(a, k), min(b, k)
    6. minHeap = []
    7. for i in range(a):
    8. for j in range(b):
    9. tmp = nums1[i] + nums2[j]
    10. heapq.heappush(minHeap, (-tmp, nums1[i], nums2[j]))
    11. while len(minHeap) > k:
    12. heapq.heappop(minHeap)
    13. ans = []
    14. while minHeap:
    15. res = heapq.heappop(minHeap)
    16. ans.append([res[1], res[2]])
    17. return ans

    Go

    1. type hp [][3]int
    2. func (h hp) Len() int {
    3. return len(h)
    4. }
    5. func (h hp) Less(i, j int) bool {
    6. return h[i][2] > h[j][2]
    7. }
    8. func (h *hp) Push(i interface{}) {
    9. *h = append(*h, i.([3]int))
    10. }
    11. func (h *hp) Pop() interface{} {
    12. old := *h
    13. n := len(old)
    14. x := old[n-1]
    15. *h = old[:n-1]
    16. return x
    17. }
    18. func (h hp) Swap(i, j int) {
    19. h[i], h[j] = h[j], h[i]
    20. }
    21. func min(a, b int) int {
    22. if a < b {
    23. return a
    24. }
    25. return b
    26. }
    27. func kSmallestPairs(nums1 []int, nums2 []int, k int) [][]int {
    28. a, b := len(nums1), len(nums2)
    29. k = min(k, a*b)
    30. a, b = min(a, k), min(b, k)
    31. minHeap := &hp{}
    32. heap.Init(minHeap)
    33. for i := 0; i < a; i++ {
    34. for j := 0; j < b; j++ {
    35. heap.Push(minHeap, [3]int{nums1[i], nums2[j], nums1[i] + nums2[j]})
    36. for minHeap.Len() > k {
    37. heap.Pop(minHeap)
    38. }
    39. }
    40. }
    41. ret := [][]int{}
    42. for i := 0; i < k; i++ {
    43. res := heap.Pop(minHeap).([3]int)
    44. a := []int{res[0], res[1]}
    45. ret = append(ret, a)
    46. }
    47. return ret
    48. }

  • 相关阅读:
    git revert 撤销之前的提交
    AI创作系统ChatGPT商业运营版源码+AI绘画/支持GPT联网提问/支持Midjourney绘画+Prompt应用+支持国内AI提问模型
    总结使人进步,4句真章的理解和实践
    jQuery
    面试题常考:LRU缓存
    东八区先生的AI公司有多离谱?
    iNFTnews|一键生成数字藏品,VERTU Web3手机是未来吗?
    【SA8295P 源码分析】125 - MAX96712 解串器 start_stream、stop_stream 寄存器配置 过程详细解析
    markdown语法转换成html渲染到页面
    Semantic Kernel 入门系列:💬Semantic Function
  • 原文地址:https://blog.csdn.net/qq_33523932/article/details/125600892