贪心算法|406.根据身高重建队列

力扣题目链接

class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        vector<vector<int>> que;
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1];
            que.insert(que.begin() + position, people[i]);
        }
        return que;
    }
};

思路理解了,但是就是看不懂代码啊

出现两个维度一起考虑的情况,我就是想不通了啊!

代码随想录 (programmercarl.com)

思路

本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。

其实如果大家认真做了135. 分发糖果 (opens new window),就会发现和此题有点点的像。

135. 分发糖果 (opens new window)我就强调过一次,遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。

如果两个维度一起考虑一定会顾此失彼

对于本题相信大家困惑的点是先确定k还是先确定h呢,也就是究竟先按h排序呢,还是先按照k排序呢?

如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。

那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。

此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高!

那么只需要按照k为下标重新插入队列就可以了,为什么呢?

以图中{5,2} 为例:

406.根据身高重建队列

按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

所以在按照身高从大到小排序后:

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

局部最优可推出全局最优,找不出反例,那就试试贪心。

一些同学可能也会疑惑,你怎么知道局部最优就可以推出全局最优呢? 有数学证明么?

在贪心系列开篇词关于贪心算法,你该了解这些! (opens new window)中,我已经讲过了这个问题了。

刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心,至于严格的数学证明,就不在讨论范围内了。

如果没有读过关于贪心算法,你该了解这些! (opens new window)的同学建议读一下,相信对贪心就有初步的了解了。

回归本题,整个插入过程如下:

排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]

插入的过程:

  • 插入[7,0]:[[7,0]]
  • 插入[7,1]:[[7,0],[7,1]]
  • 插入[6,1]:[[7,0],[6,1],[7,1]]
  • 插入[5,0]:[[5,0],[7,0],[6,1],[7,1]]
  • 插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]]
  • 插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

此时就按照题目的要求完成了重新排列。

相关推荐

  1. 贪心】LeetCode-406. 根据身高重建队列

    2024-04-10 18:18:01       54 阅读
  2. 力扣:406. 根据身高重建队列贪心

    2024-04-10 18:18:01       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 18:18:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 18:18:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 18:18:01       87 阅读
  4. Python语言-面向对象

    2024-04-10 18:18:01       96 阅读

热门阅读

  1. OceanBase数据库oceanbase-ce的docker镜像中文说明

    2024-04-10 18:18:01       42 阅读
  2. Apache POI

    2024-04-10 18:18:01       31 阅读
  3. 瑞芯微RK3568调试Android 11的各种方法

    2024-04-10 18:18:01       61 阅读
  4. python-pytorch使用日志0.5.007

    2024-04-10 18:18:01       41 阅读
  5. Android 应用启动过程

    2024-04-10 18:18:01       36 阅读
  6. ITIL教程:打造高效的IT服务管理体系

    2024-04-10 18:18:01       33 阅读
  7. Composer 超简教程(附离线文档)

    2024-04-10 18:18:01       38 阅读
  8. PHP获取路径或目录或当前文件名

    2024-04-10 18:18:01       38 阅读
  9. 【检查合法的出栈序列】

    2024-04-10 18:18:01       36 阅读
  10. ADS1299模拟前端(AFE)代替料LHE7909

    2024-04-10 18:18:01       37 阅读
  11. hive metatool 使用说明

    2024-04-10 18:18:01       43 阅读