Leetcode 373. Find K Pairs with Smallest Sums

将nums1与nums2组成的所有组合用矩阵M的形式表示,M[i][j]表示nums[i]+nums[j]

用priority queue数据结构进行维护,首先将nums[0] + nums[1]加入pq中,每次pop出一个元素时,将该元素右边和下边未访问过的元素加入pq中。

from Queue import PriorityQueue as PQ
class Solution(object):
    def kSmallestPairs(self, nums1, nums2, k):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :type k: int
        :rtype: List[List[int]]
        """
        if not nums1 or not nums2:
            return []
        result = []
        # visited记录放入过pq的数
        visited = set()
        pq = PQ()
        # 第一个参数表示sum
        # 第二个参数表示[num1中的index, num2中的index]
        pq.put((nums1[0] + nums2[0], [0,0]))
        visited.add(str([0,0]))
        for i in range(k):
            total, index = pq.get()
            idx1, idx2 = index[0], index[1]
            result.append([nums1[idx1], nums2[idx2]])
            #将右边和下边的元素加入pq中
            neighbors = [[idx1+1, idx2], [idx1, idx2+1]]
            for neighbor in neighbors:
                # 检测是否已经加入过pq
                if str(neighbor) in visited:
                    continue
                # 检测是否越界
                if neighbor[0] >= len(nums1) or neighbor[1] >= len(nums2):
                    continue
                total = nums1[neighbor[0]] + nums2[neighbor[1]]
                pq.put((total, neighbor))
                visited.add(str(neighbor))
            if not pq.queue:
                return result
        return result
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值