KK's blog

每天积累多一些

0%

LeetCode 1337 The K Weakest Rows in a Matrix

LeetCode



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

注意事项:

  1. 求最大堆,引入负值。此题属于二维堆,第二个维度跟第一个维度一样,从小到大,所以也采用负号。

Python代码:

1
2
3
4
5
6
7
8
9
10
11
12
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
nums_soldiers = [(sum(mat[i]), i) for i in range(len(mat))]
res = []
for i in range(len(nums_soldiers)):
if i < k:
heappush(res, (-nums_soldiers[i][0], -nums_soldiers[i][1]))
# put into the heap if weaker
elif -nums_soldiers[i][0] > res[0][0] or \
(nums_soldiers[i][0] == res[0][0] and -nums_soldiers[i][1] > res[0][1]):
heapreplace(res, (-nums_soldiers[i][0], -nums_soldiers[i][1]))
res.sort(key=lambda x: (-x[0], -x[1]))
return [-res[i][1] for i in range(len(res))]

算法分析:

时间复杂度为O(nlogk),空间复杂度O(n), n为行数

Free mock interview