本文主要是介绍LeetCode 1341. 方阵中战斗力最弱的 K 行(java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 题目
给你一个大小为 m * n 的方阵 mat,方阵由若干军人和平民组成,分别用 0 和 1 表示。
请你返回方阵中战斗力最弱的 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]
来源:力扣(LeetCode);
2. 方法
普通的遍历排序题。
使用冒泡排序。
class Solution {public int[] kWeakestRows(int[][] mat, int k) {int m = mat.length;int n = mat[0].length;int[] count = new int[m];int[] index = new int[m];for(int i=0; i<m; i++){index[i] = i;count[i] = n;for(int j=0; j<n;j++){if(mat[i][j] == 0){count[i] = j;break;}}}// sort the array count;for(int i=0; i<m; i++){for(int j=m-2; j>=i;j--){if(count[j+1] < count[j]){int tmp = count[j];count[j] = count[j+1];count[j+1] = tmp;int tmp2 = index[j];index[j] = index[j+1];index[j+1] = tmp2;}}}return Arrays.copyOfRange(index,0,k);}
}
方法二:
自定义一个comparator的排序,
class Solution {public int[] kWeakestRows(int[][] mat, int k) {int[][] tmp = new int[mat.length][2];for(int i = 0; i < mat.length; i++){for(int j = 0; j < mat[0].length; j++){tmp[i][0] = i;if(mat[i][j] == 1) tmp[i][1] += 1;}}Arrays.sort(tmp, (o1, o2) -> o1[1] - o2[1]);int[] res = new int[k];for(int i =0; i < k; i++){res[i] = tmp[i][0];}return res;}
}
方法三:
按列进行排序,遇到0,放入到res数组中,同时确保行不重复添加到res数组中。
这篇关于LeetCode 1341. 方阵中战斗力最弱的 K 行(java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!