美文网首页北美程序员面试干货
LintCode 465 [Kth Smallest Sum i

LintCode 465 [Kth Smallest Sum i

作者: Jason_Yuan | 来源:发表于2016-07-28 15:39 被阅读172次

    原题

    给定两个排好序的数组 A, B,定义集合 sum = a + b ,求 sum 中第k小的元素

    样例
    给出 A = [1,7,11] B = [2,4,6]
    sum = [3, 5, 7, 9, 11, 13, 13, 15, 17]
    k = 3, 返回 7.
    k = 4, 返回 9.
    k = 8, 返回 15.

    解题思路

    • 使用set来记录访问过的pair
    visited = set()
    visited.add(10)
    10 is in visited # return True 
    
    • 使用一个minHeap,每次可以取最小值。放入堆中的数据结构为(sum, i, j)
    • 每次从堆中取出一个最小值,下一轮的candidates将是(sum, i+1, j), (sum, i, j+1),将这两个candidates加入的heap之间要去重,因为有可能重复
    • 从堆中取k次之后,就拿到了想要的结果

    完整代码

    import Queue
    
    class Solution:
        # @param {int[]} A an integer arrays sorted in ascending order
        # @param {int[]} B an integer arrays sorted in ascending order
        # @param {int} k an integer
        # @return {int} an integer
        def kthSmallestSum(self, A, B, k):
            # Write your code here
            if not A or not B:
                return 0
                
            myQueue = Queue.PriorityQueue()
            visited = set()
            myQueue.put((A[0]+B[0], 0, 0))
            visited.add((0, 0))
            while k > 1:
                cur = myQueue.get()
                k -= 1
                if cur[1] + 1 < len(A) and (cur[1] + 1, cur[2]) not in visited:
                    visited.add((cur[1] + 1, cur[2]))
                    myQueue.put((A[cur[1] + 1] + B[cur[2]], cur[1] + 1, cur[2]))
                if cur[2] + 1 < len(B) and (cur[1], cur[2] + 1) not in visited:
                    visited.add((cur[1], cur[2] + 1))
                    myQueue.put((A[cur[1]] + B[cur[2] + 1], cur[1], cur[2] + 1))
            res = myQueue.get()
            return res[0]
    

    相关文章

      网友评论

        本文标题:LintCode 465 [Kth Smallest Sum i

        本文链接:https://www.haomeiwen.com/subject/wosajttx.html