刚开始写了写的思路,知道同高比位置,不同高不确定。感觉是要自己定义比较函数。然后进行不下去,看了讨论区。
思路是先按从高到低排序,同高的第二个数小的排前面。然后先把最高的排好,然后处理次高,次高的位置是此时数组的下标
因为:高个不在乎矮个插队。他只在乎他前面不比他矮的兄弟。
自己写出了代码:
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
sort(people.begin(), people.end(), compare);
int length = people.size();
for(int i=0; i<length; i++) {
if(people[i].second < i) {
pair<int, int> temp = people[i];
int index = people[i].second;
int j = i-1;
for(; j>=index; j--) {
people[j+1] = people[j];
}
people[j+1] = temp;
}
}
return people;
}
static bool compare(pair<int, int> a, pair<int, int> b) {
if(a.first == b.first) return a.second < b.second;
return a.first > b.first;
}
};
我觉得我的比较函数写的挺优秀的。
另外运行时有一个错误:invalid use of non-static member function blabala...把compare前加了static,也不太清楚是怎么回事。
正巧今天刚看了插入排序算法,所以就用插排写的。然后觉得vector有插入的工具函数,又写了一下
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
int length = people.size();
vector<pair<int, int>> result;
sort(people.begin(), people.end(), compare);
for(int i=0; i<length; i++) {
result.insert(result.begin() + people[i].second, people[i]);
}
return result;
}
};
期间有一个小疑惑:begin()是取vector的第一个元素,那vector为空时能取到吗,然而代码运行没问题,那就这样吧。
这道题所得:
1. pair
2.sort
3.insert