给你一个大小为m*n的矩阵mat,矩阵由若干军人和平民组成,分别用1和0表示。
请你返回矩阵中战斗力最弱的k行的索引,按从最弱到最强排序。
如果第i行的军人数量少于第j行,或者两行军人数量相同但i小于j,那么我们认为第i行的战斗力比第j行弱。
军人总是排在一行中的靠前位置,也就是说1总是出现在0之前。
示例1:
输入: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
输出:[2, 0, 3]
解释:
每行中的军人数目:
行0 -> 2
行1 -> 4
行2 -> 1
行3 -> 2
行4 -> 5
从最弱到最强对这些行排序后得到[2, 0, 3, 1, 4]
示例2:
输入:mat =
[[1, 0, 0, 0],
[1, 1, 1, 1],
[1, 0, 0, 0],
[1, 0, 0, 0]]
k = 2
输出:[0, 2]
解释:
每行中的军人数目:
行0 -> 1
行1 -> 4
行2 -> 1
行3 -> 1
从最弱到最强对这些行排序后得到[0, 2, 3, 1]
提示:
- m == mat.length
- n == mat[i].length
- 2 <= n, m <= 100
- 1 <= k <= m
- matrix[i][j]不是0就是1
思路:暴力解法、字典+排序、二分+大根堆等
python代码:
暴力解法:
class Solution:
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
# 暴力解法
return sorted([i for i in range(len(mat))], key=lambda x:sum(mat[x]))[:k]
字典+排序:
class Solution:
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
# 字典+排序
number = {i:0 for i in range(len(mat))}
for i in range(len(mat)):
number[i] = mat[i].count(1)
d = sorted(list(number.items()), key = lambda x:x[1])
res = [d[i][0] for i in range(k)]
return res