原题链接:1337. 矩阵中战斗力最弱的 K 行
solution: 暴力
class Solution {
public:
typedef pair<int,int> PII;
int calculate(vector<int>& line) //统计军人个数
{
int cnt = 0;
for(int i = 0;i < line.size();i++){
if(line[i] == 1) cnt++;
else break;
}
return cnt;
}
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
vector<int> res; //定义返回值
vector<PII> segs;
for(int i = 0;i < mat.size();i++){
segs.push_back({i,calculate(mat[i])});
}
//排序
sort(segs.begin(),segs.end(),[](const PII &a,const PII &b){
if(a.second < b.second) return true;
else if(a.second == b.second) return a.first < b.first;
return false;
});
for(int i = 0;i < k;i++){
res.push_back(segs[i].first);
}
return res;
}
};
优化一下:把寻找军人的个数的过程优化成二分
class Solution {
public:
typedef pair<int,int> PII;
int binarySearch(vector<int>& line) //统计军人个数
{
int n = line.size();
int l = 0,r = n - 1;
while(l < r){
int mid = l + r >> 1;
if(line[mid] == 0) r = mid;
else l = mid + 1;
}
if(line[l] != 0) return n;
return l;
}
vector<int> kWeakestRows(vector<vector<int>>& mat, int k) {
vector<int> res; //定义返回值
vector<PII> segs;
for(int i = 0;i < mat.size();i++){
segs.push_back({i,binarySearch(mat[i])});
}
sort(segs.begin(),segs.end(),[](const PII &a,const PII &b){
if(a.second < b.second) return true;
else if(a.second == b.second) return a.first < b.first;
return false;
});
for(int i = 0;i < k;i++){
res.push_back(segs[i].first);
}
return res;
}
};