You are given an
m x n
binary matrix mat
of 1
‘s (representing soldiers) and 0
‘s (representing civilians). The soldiers are positioned in front of the civilians. That is, all the 1
‘s will appear to the left of all the 0
‘s in each row.A row
i
is weaker than a row j
if one of the following is true:The number of soldiers in row
i
is less than the number of soldiers in row j
.
Both rows have the same number of soldiers and i < j
.Return the indices of the
k
weakest rows in the matrix ordered from weakest to strongest.Example 1:
Input: 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
Output: [2,0,3]
Explanation:
The number of soldiers in each row is:
- Row 0: 2
- Row 1: 4
- Row 2: 1
- Row 3: 2
- Row 4: 5
The rows ordered from weakest to strongest are [2,0,3,1,4].
Example 2:
Input: mat =
[[1,0,0,0],
[1,1,1,1],
[1,0,0,0],
[1,0,0,0]],
k = 2
Output: [0,2]
Explanation:
The number of soldiers in each row is:
- Row 0: 1
- Row 1: 4
- Row 2: 1
- Row 3: 1
The rows ordered from weakest to strongest are [0,2,3,1].
Constraints:
m == mat.length
n == mat[i].length
2 <= n, m <= 100
1 <= k <= m
*
matrix[i][j]
is either 0 or 1.题目大意:
二维数组含0和1,1表示士兵,0表示平民。每一行定义弱度,若士兵个数少且行号靠前,较弱。求前k个较弱的行号。
解题思路:
Easy题。Q&A的题目,关于前k个最值,第一时间想到用heap。求最小值,所以用最大堆
解题步骤:
N/A
注意事项:
- 求最大堆,引入负值。此题属于二维堆,第二个维度跟第一个维度一样,从小到大,所以也采用负号。
Python代码:
1 | def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]: |
算法分析:
时间复杂度为O(nlogk)
,空间复杂度O(n)
, n为行数