算法:贪心+排序+二分+树状数组
时间复杂度:O(nlognlogn)
每
次
挑
选
当
前
还
未
确
定
位
置
的
人
中
的
最
低
身
高
的
人
,
每次挑选当前还未确定位置的人中的最低身高的人,
每次挑选当前还未确定位置的人中的最低身高的人,
如
果
身
高
相
同
则
挑
选
排
在
他
前
面
的
人
数
多
的
人
,
这
样
,
如果身高相同则挑选排在他前面的人数多的人,这样,
如果身高相同则挑选排在他前面的人数多的人,这样,
在
放
置
他
的
位
置
时
,
以
前
放
置
的
人
的
位
置
不
会
对
他
当
前
放
置
的
在放置他的位置时,以前放置的人的位置不会对他当前放置的
在放置他的位置时,以前放置的人的位置不会对他当前放置的
位
置
有
任
何
影
响
,
假
如
当
前
选
中
的
人
前
面
的
人
大
于
等
于
他
的
身
高
的
位置有任何影响,假如当前选中的人前面的人大于等于他的身高的
位置有任何影响,假如当前选中的人前面的人大于等于他的身高的
有
k
个
人
,
则
他
应
该
放
在
空
位
置
的
第
k
+
1
位
,
我
们
可
以
使
用
二
分
+
树
状
数
组
优
化
。
有k个人,则他应该放在空位置的第k+1位,我们可以使用二分+树状数组优化。
有k个人,则他应该放在空位置的第k+1位,我们可以使用二分+树状数组优化。
class Solution {
public:
vector<int>tr;
int n;
int lowbit(int n){
return n & -n;
}
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 >= 1; i -= lowbit(i)) res += tr[i];
return res;
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
n = people.size();
tr.resize(n+1);
vector<vector<int>>res(n);
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];
});
for(auto x : people){
int h = x[0], k = x[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[l-1] = x;
add(l, 1);
}
return res;
}
};
作者:陈平安
链接:https://www.acwing.com/activity/content/code/content/2020650/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。