思路:
1.贪心
将身高从高到低排序。因为身高更高的人要求更少,优先插入更高的人。若两者身高相同,先插入条件少的(看到的人更少)。
#include<vector>
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& p) {
sort(p.begin(), p.end(), [](vector<int> a, vector<int> b){
return (a[0] > b[0] || (a[0] == b[0] && a[1] < b[1]));
});
vector<vector<int>> res;
for(auto i: p)
{
res.insert(res.begin() + i[1], i);
}
return res;
}
};
2.y总的思路
从小到大入手。
先放小的。由于放的时候没有人比他小,放的位置不受其他人的影响。身高从小到大,k从大到小。
对于(h,k),从前往后找到第一个空位,使得当前空位前面有k个空位。
vector<int> tr;//树状数组
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
int n = people.size();
tr.resize(n + 1);//树状数组从1开始
涉及到了树状数组的内容,我不太明白,先把代码贴上来,容我研究一番
居然在算法提高课里面,interesting
附一个链接
【此处应有链接】
class Solution {
public:
int n;
vector<int> tr;
int lowbit(int x) {
return x & -x;
}
void add(int x, int v) {
for (int i = x; i <= n; i += lowbit(i)) tr[i] += v;
}
int query(int x) {
int res = 0;
for (int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
n = people.size();
tr.resize(n + 1);
sort(people.begin(), people.end(), [](vector<int>a, vector<int>b) {
if (a[0] != b[0]) return a[0] < b[0];
return a[1] > b[1];
});
vector<vector<int>> res(n);
for (auto p: people) {
int h = p[0], k = p[1];
int l = 1, r = n;
while (l < r) {
int mid = l + r >> 1;
if (mid - query(mid) >= k + 1) r = mid;
else l = mid + 1;
}
res[r - 1] = p;
add(r, 1);
}
return res;
}
};
作者:yxc
链接:https://www.acwing.com/activity/content/code/content/525073/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。