406.根据身高重建队列
错误解答
bool f(const vector<int>&a, const vector<int>&b) {
if (a[1]==b[1])return a[0]>b[0];return a[1]<b[1];
}
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& p) {
vector<vector<int>> res;
sort(p.begin(),p.end(),f);
for ( auto peo: p ) {
if (peo[1]!=0) break;
res.push_back(peo);
}
reverse(res.begin(),res.end());
for (int i = res.size(); i < p.size(); i ++ ) {
auto x = p[i];
int insert_pos = 0; int cnt = 0;
while ( cnt < x[1] + 1 ) {
if (p[insert_pos][0] >= x[0]) cnt ++ ;
insert_pos ++ ;
}
res.insert(res.begin()+insert_pos - 1,x);
}
return res;
}
};
这道题我没有能够做出来
在135. 分发糖果 (opens new window)我就强调过一次,遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。
如果两个维度一起考虑一定会顾此失彼。
我就是错误的按照k来从小到大排序了
bool f(vector<int>& a, vector<int>& b){
if(a[0]==b[0])return a[1]<b[1];return a[0]>b[0];
}
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& p) {
vector<vector<int>> res;
sort(p.begin(),p.end(),f);
for (int i = 0; i < p.size(); i ++ ) {
auto x = p[i];
int pos = x[1];
res.insert(res.begin()+pos,x);
}
return res;
}
};
先按照身高排序,固定住规律。按照k排序没法获得额外的规律