有序矩陣中的第k個最小陣列和

2022-09-11 10:48:08 字數 1928 閱讀 5024

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版本

1

class 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 個不同的元素。看到有序就會想到二分查詢,而本題的二分查詢十分的有趣。根據這個矩陣的定義,我們知道,最小的元素是最左上角元素,最大的元素是最左下角元素。由此...