Given a m * n
matrix mat
of ones (representing soldiers) and zeros (representing civilians), return the indexes of the k
weakest rows in the matrix ordered from the weakest to the strongest.
A row i is weaker than row j, if the number of soldiers in row i is less than the number of soldiers in row j, or they have the same number of soldiers but i is less than j. Soldiers are always stand in the frontier of a row, that is, always ones may appear first and then zeros.
Example 1:
Input: 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 Output: [2,0,3] Explanation: The number of soldiers for each row is: row 0 -> 2 row 1 -> 4 row 2 -> 1 row 3 -> 2 row 4 -> 5 Rows ordered from the weakest to the strongest are [2,0,3,1,4]
Example 2:
Input: mat = [[1,0,0,0], [1,1,1,1], [1,0,0,0], [1,0,0,0]], k = 2 Output: [0,2] Explanation: The number of soldiers for each row is: row 0 -> 1 row 1 -> 4 row 2 -> 1 row 3 -> 1 Rows ordered from the weakest to the strongest are [0,2,3,1]
class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
int[] ans = new int[k];
int[][] res = new int[mat.length][2];
int[] values = new int[mat.length];
for(int i=0;i<mat.length;i++){
for(int j=0;j<mat[i].length;j++){
values[i] += mat[i][j];
}
res[i][0] = i;
res[i][1] = values[i];
}
res = sort(res);
res = sort2(res);
for(int i=0;i<k;i++){
ans[i] = res[i][0];
}
return ans;
}
public void swap(int[] a, int[] b){
int temp = 0;
for(int j=0;j<a.length;j++) {
temp=a[j];
a[j]=b[j];
b[j]=temp;
}
}
public int[][] sort(int[][] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j][1]>arr[j+1][1]){
swap(arr[j],arr[j+1]);
}
}
}
return arr;
}
public int[][] sort2(int[][] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j][1]==arr[j+1][1] && arr[j][0]>arr[j+1][0]){
swap(arr[j],arr[j+1]);
}
}
}
return arr;
}
}