力扣每日一题21.08.01矩阵中战斗力最弱的K行

给你一个大小为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值