说实话,这道题我没想出来,但是看解题报告题解比较让人觉得眼前一亮,这里记录下来

  1. package y2019.Algorithm.greedy.medium;
  2.  
  3. import java.util.Arrays;
  4. import java.util.LinkedList;
  5.  
  6. /**
  7. * @Auther: xiaof
  8. * @Date: 2019/12/19 09:05
  9. * @Description: 406. 根据身高重建队列
  10. *
  11. * 假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
  12. * 注意:
  13. * 总人数少于1100人。
  14. *
  15. * 示例
  16. * 输入:
  17. * [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
  18. * 输出:
  19. * [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
  20. *
  21. * 来源:力扣(LeetCode)
  22. * 链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
  23. * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  24. *
  25. */
  26. public class ReconstructQueue {
  27.  
  28. /**
  29. * https://leetcode-cn.com/problems/queue-reconstruction-by-height/solution/406-gen-ju-shen-gao-zhong-jian-dui-lie-pai-xu-hou-/
  30. * 执行用时 : 10 ms , 在所有 java 提交中击败了 76.85% 的用户
  31. * 内存消耗 : 40 MB , 在所有 java 提交中击败了 99.37% 的用户
  32. */
  33. public int[][] solution(int[][] people) {
  34. //1.思路就是先按照升高排序,先按照升高排序,升高相同的按照第二个前面几个人进行排序
  35. Arrays.sort(people, (v1, v2) -> v1[0] == v2[0] ? v1[1] - v2[1] : v2[0] - v1[0]);
  36. //2.然后遍历数组,依次吧中的升高添加到数据中,然后把
  37. //3.根据排好顺序的list,吧第二个参数作为下坐标add进入队列中
  38. LinkedList<int[]> res = new LinkedList<>();
  39. //因为已经加入linked的数据都是比当前遍历到的数据大的值,那么只要知道前面有几个比这个数大,直接插入即可
  40. for (int[] i : people) {
  41. res.add(i[1], i);
  42. }
  43.  
  44. return res.toArray(new int[res.size()][2]);
  45.  
  46. }
  47.  
  48. public static void main(String[] args) {
  49. int[][] param1 = {{7,0}, {4,4}, {7,1}, {5,0}, {6,1}, {5,2}};
  50.  
  51. ReconstructQueue fuc = new ReconstructQueue();
  52. System.out.println("需要添加对应的数据:");
  53. int[][] res = fuc.solution(param1);
  54. System.out.println("");
  55. System.out.println(res);
  56.  
  57. }
  58.  
  59. }

2020年1月19日08:54:11 add  》》》》》》》》》》》》》》》》》

如果使用快排进行排序速度会更快

  1. package y2019.Algorithm.greedy.medium;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7.  
  8. /**
  9. * @Auther: xiaof
  10. * @Date: 2019/12/19 09:05
  11. * @Description: 406. 根据身高重建队列 贪心算法
  12. *
  13. * 假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
  14. * 注意:
  15. * 总人数少于1100人。
  16. *
  17. * 示例
  18. * 输入:
  19. * [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
  20. * 输出:
  21. * [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
  22. *
  23. * 来源:力扣(LeetCode)
  24. * 链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
  25. * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
  26. *
  27. */
  28. public class ReconstructQueue {
  29.  
  30. //使用快排
  31.  
  32. /**
  33. * 执行用时 : 5 ms , 在所有 Java 提交中击败了 99.95% 的用户
  34. * 内存消耗 : 43.1 MB , 在所有 Java 提交中击败了 93.71% 的用户
  35. * @param people
  36. * @return
  37. */
  38. public int[][] solution2(int[][] people) {
  39. //先进行快排
  40. quikSort(people, 0, people.length);
  41. //按照顺序插入list
  42. // List<int[]> res = new ArrayList();
  43. LinkedList<int[]> res = new LinkedList<>();
  44. for (int[] i : people) {
  45. res.add(i[1], i);
  46. }
  47.  
  48. return res.toArray(new int[res.size()][]);
  49. }
  50.  
  51. public void quikSort(int[][] people, int start, int end) {
  52. if (start < end) {
  53. int mid = midSite(people, start, end);
  54. quikSort(people, start, mid);
  55. quikSort(people, mid + 1, end);
  56. }
  57. }
  58.  
  59. public int midSite(int[][] people, int start, int end) {
  60. if (start >= end) {
  61. return start;
  62. }
  63.  
  64. int midValue[] = people[start], l = start, r = end;
  65. do {
  66. do {
  67. ++l;
  68. } while (l < end && compare(people[l], midValue));
  69.  
  70. do {
  71. --r;
  72. } while (start < r && compare(midValue, people[r]));
  73.  
  74. //如果没有超出范围,交换位置
  75. if (l < r) {
  76. int[] tmp = people[l];
  77. people[l] = people[r];
  78. people[r] = tmp;
  79. }
  80. } while (l < r);
  81.  
  82. //最后吧之前中间位置数据交换回来
  83. people[start] = people[r];
  84. people[r] = midValue;
  85.  
  86. return r;
  87. }
  88.  
  89. //这里我们按照从大到小排序
  90. public boolean compare(int[] p1, int[] p2) {
  91. //比较,优先根据第二个数据比较,然后根据第一个数据比较大小
  92. if (p1[0] != p2[0]) {
  93. return p1[0] > p2[0];
  94. } else {
  95. //如果相等,第一个数据
  96. return p1[1] < p2[1];
  97. }
  98. }
  99.  
  100. public static void main(String[] args) {
  101. int[][] param1 = {{7,0}, {4,4}, {7,1}, {5,0}, {6,1}, {5,2}};
  102.  
  103. ReconstructQueue fuc = new ReconstructQueue();
  104. System.out.println("需要添加对应的数据:");
  105. int[][] res = fuc.solution2(param1);
  106. System.out.println("");
  107. System.out.println(res);
  108.  
  109. }
  110. }

【LEETCODE】73、根据身高重建队列 第406题的更多相关文章

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

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

  2. Java实现 LeetCode 406 根据身高重建队列

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

  3. Leetcode 406.根据身高重建队列

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

  4. 【LeetCode】406-根据身高重建队列

    title: 406-根据身高重建队列 date: 2019-04-15 21:13:06 categories: LeetCode tags: Java容器 比较器 贪心思想 题目描述 假设有打乱顺 ...

  5. 406 Queue Reconstruction by Height 根据身高重建队列

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

  6. Leetcode:根据身高重建队列

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

  7. [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 ...

  8. LeetCode 622:设计循环队列 Design Circular Queue

    LeetCode 622:设计循环队列 Design Circular Queue 首先来看看队列这种数据结构: 队列:先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素 ...

  9. K:leetcode 5381.查询带键的排列 这题简单,但我还能优化。精益求精,才是算法的乐趣所在!

    前言: 本题来自leetcode第184场周赛的第二小题.以前参加过周赛,觉得很有趣.苦于最近一段时间比较忙就没坚持参加了(实际上是借口来着....),由于昨晚思考一些事情,导致睡不着,所以起得有点早 ...

随机推荐

  1. Android根据加速度和地磁场传感器实现自动对焦

    在相机预览开始后新建AutoFocusManage对象即可,传入context和camera. 注意,在停止预览或者关闭相机时需调用方法中unregisterListener方法. 目前实现是当前方向 ...

  2. [Cqoi2016]K远点对 K-Dtree

    4520: [Cqoi2016]K远点对 链接 bzoj 思路 用K-Dtree求点的最远距离. 求的时候顺便维护一个大小为2k的小根堆. 不知道为啥一定会对. 代码 #include <bit ...

  3. 第04组alpha冲刺(4/4)

    队名:斗地组 组长博客:地址 作业博客:Alpha冲刺(4/4) 各组员情况 林涛(组长) 过去两天完成了哪些任务: 1.分配展示任务 2.收集各个组员的进度 3.写博客 展示GitHub当日代码/文 ...

  4. JavaScript初探系列(八)——DOM

    DOM(文档对象模型)是针对HTML和XML文档的一个API,描绘了一个层次化的节点树,允许开发人员添加.删除和修改页面的某一部分. HTML DOM 树形结构如下: 一.Node方面 (一).节点类 ...

  5. php curl 转为 x-www-form-urlencoded 方式

    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); fr ...

  6. File checksum

    File checksum https://golang.org/pkg/io/#Copy https://blog.iphpo.com/blog/2017/03/golang-產生檔案的md5-ha ...

  7. 对数损失函数logloss详解和python代码

    python机器学习-乳腺癌细胞挖掘(博主亲自录制视频)https://study.163.com/course/introduction.htm?courseId=1005269003&ut ...

  8. MQTT研究之EMQ:【EMQX使用中的一些问题记录(2)】

    我的测试环境: Linux: CentOS7 EMQX:V3.2.3 题外话: 这里主要介绍Websocket的支持问题. 对ws的支持比较正常,但是对wss的支持,调了较长的时间,没有成功. Jav ...

  9. Navicat连接MySQL8.0出现1251-Client does not support authentication protocol requested by server;

    因为安装的MySQL是8.0版本的,因为在安装的时候采用了新的加密方式. 我们需要使用 cmd命令,连接mysql 1.   更改加密方式 mysql> ALTER USER 'root'@'l ...

  10. zookeeper从3.4.8升级到3.4.14

    升级背景说明: 最近在做系统安全扫描时,扫出来zookeeper存在安全漏洞 Apache Zookeeper 缓冲区溢出漏洞(CVE--) 官方给出的升级建议: 地址:https://zookeep ...