题目分析
示例 1:
示例 2:
题目分析:
- 统计每行1的个数,按照大到小的顺序返回行号
- 数量相同则按照行号从小到大的顺序返回
- 1总是出现在0之前,且数组中只会出现1和0两种元素(也就是数组倒序有序)
- 只返回排名前k的行号.
思路一:
代码实现:
class Solution {
public Map<Integer, ArrayList<Integer>> map = new TreeMap();
public int[] kWeakestRows(int[][] mat, int k) {
int row = mat.length; // 行数.
int col = mat[0].length; // 列数.
for (int i = 0; i < row; i++) {
int count = countOne(mat[i]);
ArrayList<Integer> list = map.getOrDefault(count, new ArrayList<Integer>());
list.add(i);
map.put(count, list);
}
int[] result = new int[k];
int index = 0;
for (Map.Entry<Integer, ArrayList<Integer>> entrySet : map.entrySet()) {
ArrayList<Integer> list = entrySet.getValue();
for (Integer val : list) {
if (index == k) break;
result[index++] = val;
}
}
return result;
}
public static int countOne(int[] arr) {
int start = 0, end = arr.length - 1;
int middle = (end + start) / 2;
if (arr[0] == 0) return 0;
if (arr[end] == 1) return end + 1;
while (start <= end) {
if (arr[middle] == 1) {
start = middle + 1;
} else {
end = middle - 1;
}
middle = (start + end) / 2;
}
return middle + 1;
}
}
思路二: