题目来源
题目描述
题目解析
class Solution {
public:
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
int m = mat.size(), n = mat[0].size();
vector<pair<int, int>> power;
for (int i = 0; i < m; ++i) {
int l = 0, r = n - 1, pos = -1;
while (l <= r) {
int mid = (l + r) / 2;
if (mat[i][mid] == 0) {
r = mid - 1;
}
else {
pos = mid;
l = mid + 1;
}
}
power.emplace_back(pos + 1, i);
}
priority_queue q(greater<pair<int, int>>(), move(power));
vector<int> ans;
for (int i = 0; i < k; ++i) {
ans.push_back(q.top().second);
q.pop();
}
return ans;
}
};
class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
int [][]temp = new int[mat.length][2]; // 每一层:[第n层, 0出现的索引位置]
for (int i = 0; i < mat.length; i++){
// 第一个比0出现的位置
// 这里不能调用库函数的二分查找法:调用它的前提时是数据有序,这里数组虽然有序,但是是逆序的
temp[i][0] = i;
temp[i][1] = mat[i].length;
for (int j = 0; j < mat[i].length; j++){
if (mat[i][j] == 0){
temp[i][1] = j;
break;
}
}
}
Arrays.sort(temp, (o1, o2) -> o1[1] - o2[1]); // 根据[0出现的索引位置]升序
int[] res = new int[k];
for (int i = 0; i < k; i++){
res[i] = temp[i][0];
}
return res;
}
}