排序應用題 The K Weakest Rows in a Matrix Leetcode #1337

更新於 發佈於 閱讀時間約 3 分鐘
raw-image

題目會給定我們一個二維矩陣,矩陣裡面的1代表一位士兵,

每個row裡面,row裡面士兵的總和就代表這條row的戰鬥力

題目定義戰鬥力比較的規則:

士兵少的row戰鬥力比較小

若有兩條row的戰鬥力相等

row index比較小的那條row,戰鬥力比較小

請選出,前k個戰鬥力最弱的row


測試範例:

Example 1:

Input: mat = 
[[1,1,0,0,0],
[1,1,1,1,0],
[1,0,0,0,0],
[1,1,0,0,0],
[1,1,1,1,1]],
k = 3
Output: [2,0,3]
Explanation:
The number of soldiers in each row is:
- Row 0: 2
- Row 1: 4
- Row 2: 1
- Row 3: 2
- Row 4: 5
The rows ordered from weakest to strongest are [2,0,3,1,4].

Example 2:

Input: mat = 
[[1,0,0,0],
[1,1,1,1],
[1,0,0,0],
[1,0,0,0]],
k = 2
Output: [0,2]
Explanation:
The number of soldiers in each row is:
- Row 0: 1
- Row 1: 4
- Row 2: 1
- Row 3: 1
The rows ordered from weakest to strongest are [0,2,3,1].

約束條件:

Constraints:

  • The number of nodes in the tree is in the range [1, 100].
  • -100 <= Node.val <= 100

演算法:

先掃描過每一個row,統計每個row的戰鬥力,用tuple的形式記錄兩個資訊,
(戰鬥力, row index)。

最後用(戰鬥力, row index)排序好,選出前k個戰鬥力最弱的row,

輸出row index即為所求。


程式碼:

class Solution:
 def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
  
  # get the height of matrix
  h = len(mat)
  
  # compute the strength for each row
  strength = [ (sum(mat[row_idx]), row_idx ) for row_idx in range(h) ]
  
  # sort by 1's count and row index in ascending order
  strength.sort( key = lambda pair: (pair[0], pair[1]))
  
  # pick first k weakest rows
  return [ strength[i][1] for i in range(k) ]

時間複雜度:

max{ O( hw ) , O( h log h) }

掃描矩陣耗費O(hw),排序每條row的戰鬥力pair耗費O(h log h)

空間複雜度:

O(h) 額外使用了strength table來儲存戰鬥力。


Reference:

[1] The K Weakest Rows in a Matrix — LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
題目的輸入會給我們一個串列,要求我們從頭到尾反轉整個串列。 例子: 如果輸入是1 -> 2 -> 3,那麼輸出就是 3 -> 2 -> 1
題目會給定給我們一顆二元樹的根結點, 要求我們輸出上下顛倒的Level-order traversal的拜訪結果。
題目會給我們一顆二元樹的根節點, 要求我們對齊根節點正中央的虛擬分割線,反轉整顆二元樹。
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
  勸退文之二,各位最好是先看過自己的作品比較好。   這部作品由七個人合寫,狀況慘不忍睹,這種程度要找人寫評就是送頭。 作品:《最弱的我其實乃最強?》 作者:精靈聖殿   恩,個人心得,能接受就看看,不能接受就按右上叉叉。   看完之後,你們大概是七個人分別各寫一章,每一章文風
Thumbnail
嗨JC! 訓練體能列為一般中等的兵,是不是很痛苦? 沒錯,要上不上、要下不下的,得出奇招才行。 工作幾年後,有朝一日當你當上部門主管的那一刻,跟當兵時面臨的狀況還真的有很多相似之處。你的部屬,有的厲害,有的不行,有的一般般。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
兩通大同小異的電話,一個是受害者,一個是加害人,問題是:怎麼樣的排列組合才是正確的!每次說到排列組合,就想到我高中某次段考只考了八分的慘況,就是被可惡的排列組合害的!究竟這次優秀的弗林律師會得到一百分,還是比我更慘澹的零分?
Thumbnail
這遊戲考驗技巧和團隊合作,這必須團隊一起過去敵方那邊一起攻擊對方絕不能單獨攻擊,因為單獨攻擊沒有團隊的輸出,會死,團隊互相幫忙輸出贏面比較大
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
這是發生在退伍前的事。 基本上軍中有很多潛規則,也有很多莫名其妙的習慣及沒辦法解釋的規定。 通常一個連隊上同梯的同袍不會很多,因為同ㄧ梯次的感情都特別的好,容易出現群體結夥的團體。 所以當我的連隊上出現了十三個同梯,這是非常奇特的一件事。最可怕的是不管怎麼輪值星班長,都是輪到我們十三個下士
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
  勸退文之二,各位最好是先看過自己的作品比較好。   這部作品由七個人合寫,狀況慘不忍睹,這種程度要找人寫評就是送頭。 作品:《最弱的我其實乃最強?》 作者:精靈聖殿   恩,個人心得,能接受就看看,不能接受就按右上叉叉。   看完之後,你們大概是七個人分別各寫一章,每一章文風
Thumbnail
嗨JC! 訓練體能列為一般中等的兵,是不是很痛苦? 沒錯,要上不上、要下不下的,得出奇招才行。 工作幾年後,有朝一日當你當上部門主管的那一刻,跟當兵時面臨的狀況還真的有很多相似之處。你的部屬,有的厲害,有的不行,有的一般般。
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
兩通大同小異的電話,一個是受害者,一個是加害人,問題是:怎麼樣的排列組合才是正確的!每次說到排列組合,就想到我高中某次段考只考了八分的慘況,就是被可惡的排列組合害的!究竟這次優秀的弗林律師會得到一百分,還是比我更慘澹的零分?
Thumbnail
這遊戲考驗技巧和團隊合作,這必須團隊一起過去敵方那邊一起攻擊對方絕不能單獨攻擊,因為單獨攻擊沒有團隊的輸出,會死,團隊互相幫忙輸出贏面比較大
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
Thumbnail
這是發生在退伍前的事。 基本上軍中有很多潛規則,也有很多莫名其妙的習慣及沒辦法解釋的規定。 通常一個連隊上同梯的同袍不會很多,因為同ㄧ梯次的感情都特別的好,容易出現群體結夥的團體。 所以當我的連隊上出現了十三個同梯,這是非常奇特的一件事。最可怕的是不管怎麼輪值星班長,都是輪到我們十三個下士
Thumbnail
最近每天都有同學在解題社群提問這類型的問題,有些同學甚至po出解答來提問,表示看了解答卻還是看不懂,畢竟有時候「詳解」也沒辦法完整表達所有觀念。 排列組合是一門龐大的章節,許多人聞排組而色變,但排列組合的本質其實還是「窮舉法」,也就是把全部的可能通通列出來,只是很多地方我們可以透過計算讓窮舉變得更