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
方法三:二分*