lc1337/
给你一个大小为 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]
class Solution:
def kWeakestRows(self, mat: list[list[int]], k: int) -> list[int]:
# 可以根据每一行的大小将她们的索引进行从大到小排序。输出前k个索引。
index_list = sorted(list(range(len(mat))),key=lambda x :self.keyAccording( index = x,mat=mat))
# 特别注意下面这种错误的写法,sort()是原地操作,没有返回值。
#index_list = list(range(len(mat))).sort(key=lambda x :self.keyAccording( index = x,mat=mat))
return index_list[:k]
def keyAccording(self, mat: list[list[int]], index):
left = 0
right = len(mat[index]) - 1
ans = None
while left <= right:
mid = (left + right) // 2
if mat[index][mid] == 1:
left = mid + 1
ans = mid
else:
right = mid - 1
if ans == None:
return 0
else:
return ans + 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
aa = Solution()
print(aa.kWeakestRows(mat,k))
输出:
[2, 0, 3]
本文的创新点是自定义了比较函数,头一回应用,记录一下。
需要注意的就是:
sort()是进行原地操作,没有返回值。
sorted()是非原地操作,不影响原列表的排序,有返回值。