【LeetCode406】根据身高重建队列(贪心)
【摘要】
1.题目
2.思路
第一步骤: 对于一样物体出现2个指标的时候,我们不妨先固定一个指标进行操作(如此题先对第一个指标身高进行从大到小排序,PS:小到大排序其实也是可以的),操作后就会使得每个当前...
1.题目
2.思路
第一步骤:
对于一样物体出现2个指标的时候,我们不妨先固定一个指标进行操作(如此题先对第一个指标身高进行从大到小排序,PS:小到大排序其实也是可以的),操作后就会使得每个当前人都比自己前面一坨人身高更低,而身高越低(越在右边的)的人的第二个指标(该人左边中,比该人高的人数)就应该越大,所以根据贪心的思想,再对第二个指标进行从小到大排序。
例如:示例1排完序:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
新建一个二维vector:
[7,0]插入第0的位置
[7,1]插入第1的位置
[6,1]插入第1的位置,这时[7,1]就往后移一位了
第二步骤:
由上面例子可以看到第一步骤后,[6,1]其实位置不对,前面有2个人比它大,说明我们还要进行最后一步操作——将第二指标匹配正确,类似直接插入排序一样遍历,将当前人放在前面中已排序部分的“正确位置”(PS:正确位置指以第二指标为位置下标,这样才能使第二指标正确)。
3.代码
class Solution {
private:
static bool cmp(vector<int>& a,vector<int>& b){
if(a[0]==b[0]){
return a[1]<b[1];//身高越小的人的第二指标值越大
}
return a[0]>b[0];//身高从大到小排序
}
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
int n=people.size();
sort(people.begin(),people.end(),cmp);
vector<vector<int> >queue;
for(int i=0;i<n;i++){
int k=people[i][1];
queue.insert(queue.begin()+k,people[i]);//把每个人放在该人下标为第二指标的位置
}
return queue;
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/116108063
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)