题解:
class Solution {
public:
int first_count(const vector<int>& row) {
int left = 0;
int right = row.size()-1;
int val = 1;
while (left + 1 < right) {
int mid = left + (right-left)/2;
if (row[mid] < val) {
right = mid;
} else if (row[mid] > val) {
left = mid;
} else {
left = mid;
}
}
if (row[right] == val) {
return right+1;
}
if (row[left] == val) {
return left+1;
}
return 0;
}
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
vector<std::pair<int, int>> tables;
for (int i = 0; i < mat.size(); ++i) {
int cnt = first_count(mat[i]);
tables.push_back({cnt, i});
}
auto cmp = [](std::pair<int, int>& a, std::pair<int, int>& b) {
if (a.first < b.first) {
return true;
}
if (a.first == b.first) {
if (a.second < b.second) {
return true;
}
}
return false;
};
sort(tables.begin(), tables.end(), cmp);
int i = 0;
vector<int> result;
result.reserve(k);
for (auto entry : tables) {
if (i >= k) {
break;
}
++i;
result.push_back(entry.second);
}
return result;
}
};