代码随想录——贪心算法:根据身高重建队列 & Vector原理
代码
class Solution {
public:
static bool cmp(vector<int>& a,vector<int>& b){
if(a[0] == b[0])return a[1]<b[1];//如果身高相同,k更小的在前面
return a[0] > b[0];//身高不同就从高到低
}
// 1.数组
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
//有两个属性的贪心。只能先确定一个,不能同时考虑
//这里先确定身高从高到低。再按照k插在前面。因为后面的人身高比前面的人矮,不会影响前面已经排好了的k
sort(people.begin(),people.end(),cmp);
vector<vector<int>> ans;//不能直接插在people后
for(int i=0;i<people.size();i++){
ans.insert(ans.begin() + people[i][1],people[i]);
}
return ans;
}
// //2.链表
// vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
// //有两个属性的贪心。只能先确定一个,不能同时考虑
// //这里先确定身高从高到低。再按照k插在前面。因为后面的人身高比前面的人矮,不会影响前面已经排好了的k
// sort(people.begin(),people.end(),cmp);
// list<vector<int>> ans;
// for(int i=0;i<people.size();i++){
// int pos = people[i][1];
// auto it = ans.begin();
// while(pos--){
// it++;
// }
// ans.insert(it,people[i]);
// }
// return vector<vector<int>>(ans.begin(),ans.end());
// }
};
数组和链表的代码看上去都是O(n^2)的复杂度。但实际运行时间却不同:
2和4是链表,1、3和6是数组。
原因是vector每次insert时,如果size超过capicity了,其会扩容并全量拷贝一次。
Vector原理