此题要求实际意思就是求一个数组中每一行的战力总和,如果,有两行相同,在后面出现的较强,由于题目,需要我们返回原数组小标,我们则可以用凑整法,来比较每一行,并且把下标加上,最后对数组的每个元素取余即可求出前k个下标
class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
// 首先统计出每一行的一的个数
// 如果出现重复行,则,后面出现的加下标(前面也加)
// 进行排序输出(由于数组不可能重复)
int[] list = new int[mat.length];
int[] res = new int[k];
int x = 0;
for (int i = 0; i < mat.length; i++) {
// 利用余数进行小标的存储
list[i] = count(mat[i]) * 100 + i;
}
Arrays.sort(list);
for (int i = 0; i < k; i++) {
// 至此,数组不可能出现重复的数字,对100取模即可取出前k个下标
res[i] = list[i] % 100;
}
return res;
}
/**
* 统计有多少个军人
*/
public int count (int[] nums) {
int sum = 0;
for (int num : nums) {
// 如果不是1则可以继续循环
if (num != 1) {
break;
}
sum += num;
}
return sum;
}
}