1337. 矩阵中战斗力最弱的 K 行

给你一个大小为 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
import java.util.Arrays;

public class Solution1337 {
	public int[] kWeakestRows(int[][] mat, int k) {
		int[] out = new int[k];
		int[] sum = new int[mat.length];
		int count = 0;
		for (int i = 0; i < mat.length; i++) {
			count = 0;
			for (int j = 0; j < mat[0].length; j++) {
				if (mat[i][j] == 1) {
					count++;
				}
			}
			sum[i] = count;
		}
		// System.out.println(Arrays.toString(sum));
		int[] sort = sum.clone();
		Arrays.sort(sort);
		// System.out.println(Arrays.toString(sort));
		for (int i = 0; i < k; i++) {
			for (int j = 0; j < sum.length; j++) {
				if (sort[i] == sum[j]) {
					sum[j] = -1;
					out[i] = j;
					break;
				}
			}
		}
		return out;
	}

	public static void main(String[] args) {

		Solution1337 sol = new Solution1337();

		int[][] 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 } };
		int k = 3;
		System.out.println(Arrays.toString(sol.kWeakestRows(mat, k)));
	}
}

猜你喜欢

转载自blog.csdn.net/allway2/article/details/114375771