【LeetCode406】根据身高重建队列(贪心)

举报
野猪佩奇996 发表于 2022/01/23 01:05:03 2022/01/23
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。