题目链接:
力扣https://leetcode.cn/problems/the-k-weakest-rows-in-a-matrix/
【分析】先用二分查找找到第一个0的下标,即军人的个数,然后用自定义排序的优先队列存储前k大的Pair,当前优先队列元素个数>k时将堆顶弹出,剩下的按照从后向前的顺序就是前k小的了。
class Solution {
public class Pair implements Comparable<Pair>{
public int i;
public int val;
public Pair(int i, int val){
this.i = i; this.val = val;
}
@Override
public int compareTo(Pair o){
if(this.val < o.val) {
return 1;
}if(this.val == o.val && this.i < o.i){
return 1;
}
return -1;
}
public void show(){
System.out.println(this.i + " " + this.val);
}
}
public int binarySearch(int[] arr){
int left = 0, right = arr.length - 1, mid;
while(left <= right){
mid = (left + right) >>> 1;
if(arr[mid] == 0) right = mid - 1;
else left = mid + 1;
}
return left;
}
public int[] kWeakestRows(int[][] mat, int k) {
PriorityQueue<Pair> queue = new PriorityQueue();
List<Pair> list = new ArrayList();
int i = 0;
for(var arr: mat){
int idx = binarySearch(arr);
Pair pair = new Pair(i++, idx);
queue.add(pair);
if(queue.size() > k) queue.poll();
}
int[] ans = new int[k];
while(!queue.isEmpty()) ans[--k] = queue.poll().i;
return ans;
}
}