其他分享
首页 > 其他分享> > 32_1337. 矩阵战斗力最弱的K行

32_1337. 矩阵战斗力最弱的K行

作者:互联网

题目描述:
image
解题思路:

  • 和506相对名次其实差不多,先统计每行的战斗力,其实就是类似于相对名次中的score,然后再根据排序找到最弱的K行。这里和相对名次不同的地方在于,战斗力是可以重复的,牵扯到战斗力计算并排序的问题,需要重新写比较器,用来排序。(不选择使用数组存储,而是将数组存储到List中,再进行排序,就是因为数组的sort是不稳定排序,对于相同战斗力的两行,不能够正确排序)
  • 对于战斗力的计算,1是连续的,因此可以使用二分查找,查找到最后一个1的索引位置,再加上1就是当前战斗力值了,注意到没有1时,战斗力为0,因此可以把初始位置设置成-1.

代码:

优先队列——二分查找
class Solution {
    public int[] kWeakestRows(int[][] mat, int k) {
        int row = mat.length;
        int col = mat[0].length;
        ArrayList<int[]> ranks = new ArrayList<int[]>();
        for (int i = 0; i < row; i++) {
            int left = 0;
            int right = col - 1;
            int ans = 0;
            while (left <= right) {
                int mid = (left + right) / 2;
                if (mat[i][mid] == 1) {
                    left = mid + 1;
                    ans = left;
                }else {
                    right = mid - 1;
                }
            }
            ranks.add(new int[]{ans, i});
        }
        PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
            public int compare(int[] pair1, int[] pair2) {
                if (pair1[0] != pair2[0]) {
                    return pair1[0] - pair2[0];
                }else {
                    return pair1[1] - pair2[1];
                }
            }
        });
        for (int[] rank : ranks) {
            pq.offer(rank);
        }
        int[] answers = new int[k];
        for (int i = 0; i < k; i++) {
            answers[i] = pq.poll()[1];
        }
        return answers;
    }
}

标签:pair1,pair2,战斗力,int,32,1337,最弱,new,排序
来源: https://www.cnblogs.com/forrestyu/p/16178865.html