题目说明
给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。
请你返回矩阵中战斗力最弱的 k 行的索引,按从最弱到最强排序。
如果第 i 行的军人数量少于第 j 行,或者两行军人数量相同但 i 小于 j,那么我们认为第 i 行的战斗力比第 j 行弱。
军人 总是 排在一行中的靠前位置,也就是说 1 总是出现在 0 之前。
提示:
m == mat.length
n == mat[i].length
2 <= n, m <= 100
1 <= k <= m
matrix[i][j] 不是 0 就是 1
示例
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 输入: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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 输入: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]
|
笔者理解
此题是一道数组算法问题,在力扣题库中被定义为简单题。
解法
当笔者阅读完此题后,直接暴力计算出各行的战斗力,然后排序,让我们来看看具体如何实现的吧。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Solution {
public int[] kWeakestRows(int[][] mat, int k) { int n = mat.length; int m = mat[0].length;
Integer [][] nums = new Integer[n][2];
for (int i = 0; i < n; i++) { int temp = 0; for (int j = 0; j < m; j++) { temp += mat[i][j]; } nums[i][0] = i; nums[i][1] = temp; }
Arrays.sort(nums, (o1, o2) -> { if (o1[1].equals(o2[1])) { return o1[0].compareTo(o2[0]); } else { return o1[1].compareTo(o2[1]); } }); int[] result = new int [k];
for (int i = 0; i < k; i++) { result[i] = nums[i][0]; }
return result; } }
|
时间空间效率都还行,可见此解法还比较适合此题;

总结
本题是今天的每日一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。