题目详情

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

注意:

总人数少于1100人。

示例

  1. 输入:
  2. [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
  3. 输出:
  4. [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

解题思路

此题放在贪心算法中, 是用贪心的思想来解题

首先对数组 按照第一个元素height 降序排列

此时 数组前面的元素的height 大于后面元素的height

然后 以每个元素的k值 插入到返回数组里, 比如元素的k为 2, 就插到 返回数组的下标为2的位置。

以题目的例子来进行操作

  1. 这是原来的数组
  2. people = [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
  3. 按照height进行降序排序之后
  4. people = [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
  5. 对降序后的people数组 从第一个元素开始 把每个元素加入到返回数组
  6. 加入的策略是, 按照每个元素的k 来插入到下表为k的位置上
  7. 1.
  8. 插入 [7,0]
  9. 插入到离开始位置偏移了0个距离的位置。
  10. result = [[7,0]]
  11. 2.
  12. 插入 [7,1]
  13. 插入到离开始位置偏移了1个距离的位置,即插入到[7,0]的后面。
  14. result = [[7,0], [7,1]]
  15. 3.
  16. 插入 [6,1]
  17. 插入到离开始位置偏移了1个距离的位置,即插入到[7,0]的后面。
  18. result = [[7,0], [6,1], [7,1]]
  19. 4.
  20. 插入 [5,0]
  21. 插入到离开始位置偏移了0个距离的位置,即插入到[7,0]的前面。
  22. result = [[5,0], [7,0], [6,1], [7,1]]
  23. 5.
  24. 插入 [5,2]
  25. 插入到离开始位置偏移了2个距离的位置,即插入到[7,0]的后面。
  26. result = [[5,0], [7,0], [5,2], [6,1], [7,1]]
  27. 6.
  28. 插入 [4,4]
  29. 插入到离开始位置偏移了4个距离的位置,即插入到[6,1]的后面。
  30. result = [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
  31. 得到最终结果
  32. result: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

贪心证明

把每个元素以k 插进去, 因为是按照height 来由大到小插进去的, 把元素插进第k位置, 插入后前面的height 是比当前插入元素大(因为已经插入的元素height大或者相等), 这就满足了排在前面身高大于或等于的人数为k, 但是要注意 我现在说的数组 并不是最终结果的数组, 而是插入这个元素形成的中间数组。 是相对于 中间数组来说的。

那么有一个问题了, 最终结果里 [6,1] 前面有[5,0], [5,1], 这些height是小于6的, 但是排在[6,1]前面, 这些元素是在[6,1]加进去之后加进去的, 这些加进去的元素对 [6,1] 满足的条件(排在前面身高大于或等于的人数为k) 会有影响吗? 答案是不会的,因为在[6,1]加进去的元素的height 是小于6的 无论加在哪个地方对 [6,1]的 k 不会改变。

综上, 此算法能求出结果

AC代码

  1. class Solution {
  2. public:
  3. vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
  4. vector<pair<int, int>> result;
  5. // lambda 表达式
  6. sort(people.begin(), people.end(), [](pair<int, int> a, pair<int, int> b){
  7. return a.first > b.first || (a.first == b.first && a.second < b.second);
  8. });
  9. for (auto i: people) {
  10. result.insert(result.begin() + i.second, i);
  11. }
  12. return result;
  13. }
  14. };

总结

因为在前面贪心的过程中 插入的元素不会对前面已经插入元素的k造成印象, 所以才能贪心, 否则 就可能用到其他的方法来解题了。

LeetCode406 queue-reconstruction-by-height详解的更多相关文章

  1. LeetCode406. Queue Reconstruction by Height Add to List

    Description Suppose you have a random list of people standing in a queue. Each person is described b ...

  2. sort学习 - LeetCode #406 Queue Reconstruction by Height

    用python实现多级排序,可以像C语言那样写个my_cmp,然后在sort的时候赋给参数cmp即可 但实际上,python处理cmp 是很慢的,因为每次比较都会调用my_cmp:而使用key和rev ...

  3. LN : leetcode 406 Queue Reconstruction by Height

    lc 406 Queue Reconstruction by Height 406 Queue Reconstruction by Height Suppose you have a random l ...

  4. LeetCode 406. 根据身高重建队列(Queue Reconstruction by Height) 46

    406. 根据身高重建队列 406. Queue Reconstruction by Height 题目描述 假设有打乱顺序的一群人站成一个队列.每个人由一个整数对 (h, k) 表示,其中 h 是这 ...

  5. LC 406. Queue Reconstruction by Height

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

  6. [Swift]LeetCode406. 根据身高重建队列 | Queue Reconstruction by Height

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

  7. [LeetCode] Queue Reconstruction by Height 根据高度重建队列

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

  8. [LeetCode] 406. Queue Reconstruction by Height 根据高度重建队列

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

  9. Queue Reconstruction by Height

    Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...

  10. 406. Queue Reconstruction by Height

    一开始backtrack,设计了很多剪枝情况,还是TLE了 ..后来用PQ做的. 其实上面DFS做到一半的时候意识到应该用PQ做,但是不确定会不会TLE,就继续了,然后果然TLE了.. PQ的做法和剪 ...

随机推荐

  1. Ethical Hacking - GAINING ACCESS(13)

    CLIENT SIDE ATTACKS Backdoor delivery method2 - backdooring exe downloads Backdoor any exe the targe ...

  2. 集训作业 洛谷P1443 马的遍历

    这个题是个搜索,而且有是最少的步数,肯定就是广搜啦,不知道为什么的同学先去学习一下广搜吧. 养成好习惯,看见最少步数就去想想广搜(只是我自己觉得) 竟然这个题可以如此顺畅的想到广搜,感觉不难啊,但还有 ...

  3. 题解 洛谷 P4112 【[HEOI2015]最短不公共子串】

    给定两个字符串\(A\)和\(B\),我们需要找出一个串,其在\(A\)中出现且不在\(B\)中出现,这个串为子串或者子序列,求在每种情况下,该串的最短长度. 考虑到后缀自动机可以识别一个字符串的所有 ...

  4. git常用命令操作

    git常用命令 #查看配置 git config -l #查看系统config git config --system --list #查看当前用户(global)配置 git config --gl ...

  5. Thymeleaf从入门到精通

    什么是Thymeleaf 大家好,我是bigsai,今天我们来学习Thymeleaf,如果你对Thymeleaf比较陌生也不要紧,它很容易学习与理解,并有着自己鲜明的特色. 开始之前,我们依旧问一个问 ...

  6. 一周一个中间件-ES搜索引擎

    ---toc: truetitle: 一周一个中间件-ES搜索引擎date: 2019-09-19 18:43:36tags: - 中间件 - 搜索引擎--- ## 前言 > 在众多搜索引擎中, ...

  7. Java复习总结(二)Java SE 面试题

    Java SE基础知识 目录 Java SE 1. 请你谈谈Java中是如何支持正则表达式操作的? 2. 请你简单描述一下正则表达式及其用途. 3. 请你比较一下Java和JavaSciprt? 4. ...

  8. springboot+quartz以持久化的方式实现定时任务

    springboot+queue以持久化的方式实现定时任务 篇幅较长,耐心的人总能得到最后的答案 小生第一次用quartz做定时任务,不足之处多多谅解. 首先 在springboot项目里做定时任务是 ...

  9. Android Zero (开篇)

    Android Zero == 从零开始 本文章主要打算给将要入门Android或刚刚入门Android的小伙伴适用的,开篇的几个案例都会抛弃所有现在用到的新技术和第三方框架,用最原生的方法从0演示, ...

  10. Fortify Audit Workbench 笔记 Password Management: Password in Configuration File(明文存储密码)

    Password Management: Password in Configuration File(明文存储密码) Abstract 在配置文件中存储明文密码,可能会危及系统安全. Explana ...