Leetcode 1337.方阵中战斗力最弱的 K 行
1 题目描述(Leetcode题目链接)
给你一个大小为 m * n 的方阵 mat,方阵由若干军人和平民组成,分别用 1 和 0 表示。
请你返回方阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。
如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。
军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。
输入: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]
提示:
- m == mat.length
- n == mat[i].length
- 2 <= n, m <= 100
- 1 <= k <= m
- matrix[i][j] 不是 0 就是 1
2 题解
二分查找每行第一个0的位置,其下标就是这行的战斗力,然后根据战斗力排序返回前k个就可以了。
class Solution:
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
arr = []
m, n = len(mat), len(mat[0])
for i in range(m):
power = self.biSearch(mat[i], n)
arr.append((power, i))
arr.sort()
return [arr[i][1] for i in range(k)]
def biSearch(self, line, n):
i, j = 0, n
while i < j:
mid = (i + j)//2
if line[mid] == 1:
i = mid + 1
else:
j = mid
return i
直接用求和排序也可以
class Solution:
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
arr = sorted(enumerate(mat), key = lambda x:sum(x[1]))
return [arr[i][0] for i in range(k)]