题目:给你一个大小为 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
分析:
-
返回一个长度为k的数组
-
数组时按照1的数量从小到大排列
-
1数量相同,靠后的比前面的强
-
1都在前
思路1:
- 创建一个数组result,保存每一行的1的个数,以及它的位于哪一行
- 遍历矩阵,如果为1,就个数加1,不为1,跳出本次循环,并记录行数。
- result遍历排序
- result遍历取出所有的i,存入resultArr。
代码:
/** * @param {number[][]}
mat * @param {number}
k * @return {number[]}
*/
var kWeakestRows = function(mat, k) {
const result =[];
for(let i = 0; i < mat.length; i++) {
let count = 0;
for(let j = 0; j < mat[i].length; j++){
const val = mat[i][j]
if (val === 1) {
count ++;
} else {
break;
}
}
result.push({count, i})}
}
for(let i =0; i<result.length -1 ;i++){
for(let j = 1; j<result.length;j++){
if (result[i].count > result[i].count) {
const temp = result[i];
result[i] = result[j];
result[j] = temp;
}
}
}
let resultArr = [];
for(let i =0; i < result.length; i++){
resultArr.push(result.i)}
return resultArr;
};
}