1337. 矩阵中战斗力最弱的 K 行
给你一个大小为 m * n
的矩阵 mat
,矩阵由若干军人和平民组成,分别用 1 和 0 表示。
请你返回矩阵中战斗力最弱的 k
行的索引,按从最弱到最强排序。
如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。
军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。
示例 1:
示例 2:
提示:
-
m == mat.length
-
n == mat[i].length
-
2 <= n, m <= 100
-
1 <= k <= m
-
matrix[i][j]
不是 0 就是 1
二、方法一
暴力解法,通过统计,每一行的大小,然后进行排序,输出前k行
- 时间复杂度:遍历矩阵的复杂度为 O(m * n);排序复杂度为 O*(mlogm);构造答案复杂度为 O*(k)。整体复杂度为O(max(m∗n,mlogm))
- 空间复杂度:O(m) 空间用于存储所有的行战力;O(logm) 空间用于排序。整体复杂度为 O(m+logm)
三、方法二
由于军人在前面相当于有序,我们可以通过二分查找,找到最后一个军人的位置,建立一个大根堆,如果当前的值比堆顶大就社群,如果比堆顶小,则弹出堆顶的元素,然后把这个元素加入堆,最后从堆弹出k个组数
- 时间复杂度:二分得到每行的战力情况,复杂度为O(mlogn);堆中最多有 k* 个元素,将行信息存入堆中复杂度为 O(mlogk);构造答案复杂度为 O(klogk)。整体复杂度为 O(m∗(logn+log*k))
- 空间复杂度:O(k)