0
点赞
收藏
分享

微信扫一扫

矩阵中战斗力最弱的 K 行

快乐小码农 2021-09-21 阅读 72
今日算法
题目分析
示例 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;
    }

}
思路二:
举报

相关推荐

矩阵中战斗力最弱的k行

0 条评论