如果用 Python 來寫的話,其實可以運用語言特性來進一步減少要做的事情。
由於 Python 的排序是 stable 的,亦即相同的元素會保有原有的順序;
而如果我們直接對陣列做排序,因為 Python 中陣列的比較是 element-wise 的,
所以如果:
1. 陣列 i 比陣列 j 的士兵還多
-> 陣列 i 的 0 會比陣列 j 早出現
-> 對 Python 的 list 排序來說,陣列 i < 陣列 j
-> 剛好是題目要的
2. 陣列 i 與陣列 j 的士兵一樣多
-> Stable
-> i 跟 j 的順序會保持原樣
-> 也符合題目要求
因此,可以直接對陣列做排序。
Code:
class Solution:
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
result = [(idx, soldiers) for idx, soldiers in enumerate(mat)]
result.sort(key=lambda x: x[1])
return [i for i, v in result[:k]]
而且還可以塞成一行 XD
Code:
class Solution:
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
return [i for i, v in sorted([(idx, soldiers) for idx, soldiers in
enumerate(mat)], key=lambda x: x[1])[:k]]
最後的 [:k] 要放裡面或外面都可以,但放裡面應該比較快一點。
我絕對不會說我是寫錯然後發現還是 AC,於是研究了一下才發文的 (X
※ 引述《Rushia (みけねこ的鼻屎)》之銘言:
: https://leetcode.com/problems/the-k-weakest-rows-in-a-matrix/description
: 1337. The K Weakest Rows in a Matrix
: 給你一個陣列mat[][],mat[i][j] = 0 表示市民,1 表示士兵,給予一個數字 k
: ,如果一個列的士兵越少這個列的守備越薄弱,如果士兵一樣多比較上面的列更
: 薄弱,求出前 k 個守備薄弱的列。
: 思路:
: 1.用一個 Heap 儲存每一列的士兵數量和列編號,依照題目要求排序。
: 2.從 Heap 取出 k 個元素,把他們的編號返回即可。
: Java Code:
: