Re: [闲聊] 每日LeetCode

楼主: GTR12534 (カラス)   2023-09-19 00:27:57
如果用 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:
:
作者: NTUEE2CS (EE转CS)   2023-09-19 00:29:00
py大师
作者: a000000000 (九个零喔)   2023-09-19 00:33:00
自己掰py
作者: sustainer123 (caster)   2023-09-19 00:47:00
大师
作者: Rushia (みけねこ的鼻屎)   2023-09-19 00:56:00
恨py
作者: JerryChungYC (JerryChung)   2023-09-19 00:56:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com