leetcode題目
給你乙個 m * n 的矩陣 mat,以及乙個整數 k ,矩陣中的每一行都以非遞減的順序排列。
你可以從每一行中選出 1 個元素形成乙個陣列。返回所有可能陣列中的第 k 個 最小 陣列和。
示例 1:
輸入:mat = [[1,3,11],[2,4,6]], k = 5
輸出:7
解釋:從每一行中選出乙個元素,前 k 個和最小的陣列分別是:
[1,2], [1,4], [3,2], [3,4], [1,6]。其中第 5 個的和是 7 。
示例 2:
輸入:mat = [[1,3,11],[2,4,6]], k = 9
輸出:17
示例 3:
輸入:mat = [[1,10,10],[1,4,5],[2,3,6]], k = 7
輸出:9
解釋:從每一行中選出乙個元素,前 k 個和最小的陣列分別是:
[1,1,2], [1,1,3], [1,4,2], [1,4,3], [1,1,6], [1,5,2], [1,5,3]。其中第 7 個的和是 9 。
示例 4:
輸入:mat = [[1,1,10],[2,2,9]], k = 7
輸出:12
這道題我本來想用回溯法列出所有可能,然後進行排序,果不其然超時了。
還有一種方法是這次重點要講的,也就是使用堆結構+廣度優先遍歷的方法來求解。
具體思路:先把初始陣列元素以及初始的陣列和 加入小頂堆中,依次彈出堆中元素,彈出的元素代表了堆中存在的最小和的陣列。當彈出到第k次時,即我們所要的答案。當每次彈出元素時,將該元素之和的所有可能陣列放到堆中。
**python版本
1class solution:
2 def kthsmallest(self, mat: list[list[int]], k: int) ->int:
3 m,n = len(mat),len(mat[0])
4 pointer = [0]*m
5 cur_sum = 0
6for i in
range(m):
7 cur_sum += mat[i][0]
8 heap =
9 element =[cur_sum,tuple(pointer)]
1011 repeat =set()
12repeat.add(tuple(pointer))
13 idx = 0
14while
idx16
for i,j in
enumerate(pointer):
17if j:
18 new_pointer =list(pointer)
19 new_pointer[i] = j+1
20 new_pointer =tuple(new_pointer)
21if new_pointer not in
repeat:
22 cur_sum = 0
23for x,y in
enumerate(list(new_pointer)):
24 cur_sum+=mat[x][y]
25 element =[cur_sum,new_pointer]
2627
repeat.add(new_pointer)
28 idx+=1
29return res
求陣列中第k個最小數
一 問題描述 給定乙個陣列,陣列中的資料無序,在乙個陣列中找出其第k個最小的數,例如對於陣列x,x 則其第2個最小的數為2。二 解題思路 本演算法跟快排的思想相似,首先在陣列中選取乙個數centre作為樞紐,將比centre小的數,放到centre的前面將比centre大的數,放到centre的後面...
陣列中的第k小數
描述 以盡量高效率求出亂序中的k小數 輸入 第一行 陣列長度 第二行 陣列元素 空格隔開 第三性 第幾小的數 輸出 第k小的數 樣例輸入 5 6 1 2 9 3 8 2樣例輸出 解題思路利用快速排序找到主元的位置,判斷主元是第幾小的 主元位置大了剪掉右邊的 主元位置小了剪掉左邊的 假設要找第三小的數...
有序矩陣中第k小元素
題目 給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。看到有序就會想到二分查詢,而本題的二分查詢十分的有趣。根據這個矩陣的定義,我們知道,最小的元素是最左上角元素,最大的元素是最左下角元素。由此...