32_1337. 矩阵战斗力最弱的K行
作者:互联网
题目描述:
解题思路:
- 和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