leetcode-187周赛-5403-有序矩阵中的第k个最小数组和*

题目描述:

 

 

 

 方法一:暴力法O(m*max(n,klog(k))  O(k)

使用 vector<int> ans 记录各个行选一个数相加的和
11. 记录的方法是,先保存第一行各数
12. 然后把第二行的各数拿出来,组合相加
13. 对其排列,超过 k 个就不需要保留了
14. 相加之后记录回 ans ,下次拿出第三行各数,与其组合相加
返回第 k 个最小数组和

class Solution:
    def kthSmallest(self, mat: List[List[int]], k: int) -> int:
        last_row = [0]
        for i in range(len(mat)):
            new_row = [] 
            for j in range(len(mat[0])):
                for p in last_row:
                    new_row.append(p + mat[i][j])
            new_row.sort()
            if len(new_row) > k:
                last_row = new_row[ :k]
            else:
                last_row = new_row
        return last_row[k - 1]

方法二:堆 O(kmlogk) O(km^2)

class Solution:
    def kthSmallest(self, mat: List[List[int]], k: int) -> int:
        m, n = len(mat), len(mat[0])
        h = []
        temp = [sum(row[0] for row in mat)] + [0]*m
        temp = tuple(temp)
        h = [temp]
        check = set(tuple([0]*m))
        
        count = 0
        while h:
            #print(h, h[0])
            t = heapq.heappop(h)
            count += 1
            s = t[0]
            if count == k:
                return s
            cur = list(t[1:])
            for i,v in enumerate(cur):
                if v < n - 1:
                    cur[i] += 1
                    if tuple(cur) not in check:
                        check.add(tuple(cur))
                        heapq.heappush(h, tuple([t[0] + mat[i-1][cur[i]] - mat[i-1][cur[i] - 1]] + cur))
                    cur[i] -= 1

方法三:二分*

 

posted @ 2020-05-03 20:41  oldby  阅读(181)  评论(0编辑  收藏  举报