【LEETCODE】73、根据身高重建队列 第406题
说实话,这道题我没想出来,但是看解题报告题解比较让人觉得眼前一亮,这里记录下来
- package y2019.Algorithm.greedy.medium;
- import java.util.Arrays;
- import java.util.LinkedList;
- /**
- * @Auther: xiaof
- * @Date: 2019/12/19 09:05
- * @Description: 406. 根据身高重建队列
- *
- * 假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
- * 注意:
- * 总人数少于1100人。
- *
- * 示例
- * 输入:
- * [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
- * 输出:
- * [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
- *
- * 来源:力扣(LeetCode)
- * 链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
- * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- *
- */
- public class ReconstructQueue {
- /**
- * https://leetcode-cn.com/problems/queue-reconstruction-by-height/solution/406-gen-ju-shen-gao-zhong-jian-dui-lie-pai-xu-hou-/
- * 执行用时 : 10 ms , 在所有 java 提交中击败了 76.85% 的用户
- * 内存消耗 : 40 MB , 在所有 java 提交中击败了 99.37% 的用户
- */
- public int[][] solution(int[][] people) {
- //1.思路就是先按照升高排序,先按照升高排序,升高相同的按照第二个前面几个人进行排序
- Arrays.sort(people, (v1, v2) -> v1[0] == v2[0] ? v1[1] - v2[1] : v2[0] - v1[0]);
- //2.然后遍历数组,依次吧中的升高添加到数据中,然后把
- //3.根据排好顺序的list,吧第二个参数作为下坐标add进入队列中
- LinkedList<int[]> res = new LinkedList<>();
- //因为已经加入linked的数据都是比当前遍历到的数据大的值,那么只要知道前面有几个比这个数大,直接插入即可
- for (int[] i : people) {
- res.add(i[1], i);
- }
- return res.toArray(new int[res.size()][2]);
- }
- public static void main(String[] args) {
- int[][] param1 = {{7,0}, {4,4}, {7,1}, {5,0}, {6,1}, {5,2}};
- ReconstructQueue fuc = new ReconstructQueue();
- System.out.println("需要添加对应的数据:");
- int[][] res = fuc.solution(param1);
- System.out.println("");
- System.out.println(res);
- }
- }
2020年1月19日08:54:11 add 》》》》》》》》》》》》》》》》》
如果使用快排进行排序速度会更快
- package y2019.Algorithm.greedy.medium;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.LinkedList;
- import java.util.List;
- /**
- * @Auther: xiaof
- * @Date: 2019/12/19 09:05
- * @Description: 406. 根据身高重建队列 贪心算法
- *
- * 假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
- * 注意:
- * 总人数少于1100人。
- *
- * 示例
- * 输入:
- * [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
- * 输出:
- * [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
- *
- * 来源:力扣(LeetCode)
- * 链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
- * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- *
- */
- public class ReconstructQueue {
- //使用快排
- /**
- * 执行用时 : 5 ms , 在所有 Java 提交中击败了 99.95% 的用户
- * 内存消耗 : 43.1 MB , 在所有 Java 提交中击败了 93.71% 的用户
- * @param people
- * @return
- */
- public int[][] solution2(int[][] people) {
- //先进行快排
- quikSort(people, 0, people.length);
- //按照顺序插入list
- // List<int[]> res = new ArrayList();
- LinkedList<int[]> res = new LinkedList<>();
- for (int[] i : people) {
- res.add(i[1], i);
- }
- return res.toArray(new int[res.size()][]);
- }
- public void quikSort(int[][] people, int start, int end) {
- if (start < end) {
- int mid = midSite(people, start, end);
- quikSort(people, start, mid);
- quikSort(people, mid + 1, end);
- }
- }
- public int midSite(int[][] people, int start, int end) {
- if (start >= end) {
- return start;
- }
- int midValue[] = people[start], l = start, r = end;
- do {
- do {
- ++l;
- } while (l < end && compare(people[l], midValue));
- do {
- --r;
- } while (start < r && compare(midValue, people[r]));
- //如果没有超出范围,交换位置
- if (l < r) {
- int[] tmp = people[l];
- people[l] = people[r];
- people[r] = tmp;
- }
- } while (l < r);
- //最后吧之前中间位置数据交换回来
- people[start] = people[r];
- people[r] = midValue;
- return r;
- }
- //这里我们按照从大到小排序
- public boolean compare(int[] p1, int[] p2) {
- //比较,优先根据第二个数据比较,然后根据第一个数据比较大小
- if (p1[0] != p2[0]) {
- return p1[0] > p2[0];
- } else {
- //如果相等,第一个数据
- return p1[1] < p2[1];
- }
- }
- public static void main(String[] args) {
- int[][] param1 = {{7,0}, {4,4}, {7,1}, {5,0}, {6,1}, {5,2}};
- ReconstructQueue fuc = new ReconstructQueue();
- System.out.println("需要添加对应的数据:");
- int[][] res = fuc.solution2(param1);
- System.out.println("");
- System.out.println(res);
- }
- }
【LEETCODE】73、根据身高重建队列 第406题的更多相关文章
- LeetCode 406. 根据身高重建队列(Queue Reconstruction by Height) 46
406. 根据身高重建队列 406. Queue Reconstruction by Height 题目描述 假设有打乱顺序的一群人站成一个队列.每个人由一个整数对 (h, k) 表示,其中 h 是这 ...
- Java实现 LeetCode 406 根据身高重建队列
406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. ...
- Leetcode 406.根据身高重建队列
根据身高重建队列 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意:总人 ...
- 【LeetCode】406-根据身高重建队列
title: 406-根据身高重建队列 date: 2019-04-15 21:13:06 categories: LeetCode tags: Java容器 比较器 贪心思想 题目描述 假设有打乱顺 ...
- 406 Queue Reconstruction by Height 根据身高重建队列
假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列.注意:总人数少于1100人.示 ...
- Leetcode:根据身高重建队列
题目 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意: 总人数少于11 ...
- [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 ...
- LeetCode 622:设计循环队列 Design Circular Queue
LeetCode 622:设计循环队列 Design Circular Queue 首先来看看队列这种数据结构: 队列:先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素 ...
- K:leetcode 5381.查询带键的排列 这题简单,但我还能优化。精益求精,才是算法的乐趣所在!
前言: 本题来自leetcode第184场周赛的第二小题.以前参加过周赛,觉得很有趣.苦于最近一段时间比较忙就没坚持参加了(实际上是借口来着....),由于昨晚思考一些事情,导致睡不着,所以起得有点早 ...
随机推荐
- Linux 系统管理——系统安全及应用
chagen -d 0 ____用户名:下次登录时必须修改密码 ctrl+R:查看历史记录 history:查看历史记录 清除历史记录: >.bash _history echo“”>.b ...
- 系统权限远程线程注入到Explorer.exe
目录 提升为系统权限,注入到explorer中 一丶简介 二丶注入效果图 提升为系统权限,注入到explorer中 一丶简介 我们上一面说了系统服务拥有系统权限.并且拥有system权限.还尝试启动了 ...
- [算法模板]ST表
[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义 ...
- Mysql 查询今天,这周,这个月,今年的数据
今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...
- pip安装yaml
1.安装:输入pip install pyyaml或者pip3 install pyyaml 2.检查是否安装成功:输入python
- shell 备份mysql
shell脚本备份mysql,放在crontab中,可以作为每日测试用数据库备份 #!/bin/bash string_time=`date +%Y%m%d%H%M`; file_path=`date ...
- 基于Vue SEO的四种方案
基于Vue SEO的四种方案 https://segmentfault.com/a/1190000019623624?utm_source=tag-newest
- JavaScript 工厂模式
//工厂 function FruitMaker() { //function 后不带方法名,这里cococola未定义,make return时,返回 FruitMaker.cococola thi ...
- python开源项目聚合推荐【1】
******************************************************* 01项目名:unimatrix 功能介绍:Python模拟“黑客帝国”影片中的终端动画脚 ...
- somatic mutation体细胞变异检测文献分享--转载
转载 :http://blog.sina.com.cn/s/blog_83f77c940102xuro.html Kalatskaya I, Trinh Q M, Spears M, et al. I ...