日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并)

發(fā)布時間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
技巧二 - 多路歸并其實這個技巧,叫做多指針優(yōu)化可能會更合適,只不過這個名字實在太過樸素且容易和雙指 針什么的混淆,因此我給 ta 起了個別致的名字 - 多路歸并。多路體現(xiàn)在:有多條候選路線。代碼上,我們可使用多指針來表示。歸并體現(xiàn)在:結(jié)果可能 是多個候選路線中最長的或者最短,也可能是第 k 個 等。因此我們需要對多條路線的結(jié)果進行比較,并根據(jù)題目描述舍棄或者選取某一個或多個路線 給你一個 m?* n 的矩陣 mat,以及一個整數(shù) k ,矩陣中的每一行都以非遞減的順序排列。你可以從每一行中選出 1 個元素形成一個數(shù)組。返回所有可能數(shù)組中的第 k 個 最小 數(shù)組和。示例 1:輸入:mat = [[1,3,11],[2,4,6]], k = 5 輸出:7 解釋:從每一行中選出一個元素,前 k 個和最小的數(shù)組分別是: [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 個和最小的數(shù)組分別是: [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 輸出:12import heapqclass Solution:def kthSmallest(self, mat: List[List[int]], k: int) -> int:# 初始化堆h = []# sum(vec[0] for vec in mat) 是m個數(shù)組的首項和# [0] * m 是一個初始化長度為m且全部為0的填充數(shù)組# 組裝成元祖方便使用cur = (sum(vec[0] for vec in mat), tuple([0] * len(mat)))# 入堆heapq.heappush(h, cur)seen = set(cur)for _ in range(k):# acc是當(dāng)前和,pointers是指針情況acc, pointers = heapq.heappop(h)# 每次粗暴的移動指針數(shù)組中的一個指針,每移動一個指針就分叉一次,一共可能移動的情況是n, 其中n為一維數(shù)組的長度for i, pointer in enumerate(pointers):# 如果pointer == len(mat[0]) - 1說明到頭啦不能移動啦if pointer != len(mat[0]) - 1:# 修改pointers[i] 的指針維pointers[i] + 1t = list(pointers)t[i] = pointer + 1tt = tuple(t)# 將更新后的acc和指針數(shù)組重新入堆if tt not in seen:seen.add(tt)heapq.heappush(h, (acc + mat[i][pointer + 1] - mat[i][pointer], tt))return acc

總結(jié)

以上是生活随笔為你收集整理的77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。