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

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题的更多相关文章

  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. [RN] React Native 删除第三方开源组件依赖包 后 还要做的 (以 删除 react-native-video为例)

    近期测试使用了下  react-native-video 使用一直不成功,后来想着删除掉, 使用命令: npm uninstall react-native-video 重新编译后,还是一直报错 后来 ...

  2. Java代码题目:计算奖金和完全平方数

    1.计算奖金 题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:2 ...

  3. 关于m3u8文件, ts文件解密, hls 解密. 一些记录

    使用openssl 解密 openssl aes-128-cbc -d -in 原.ts -out 解密后.ts -nosalt -iv 偏移量 -K key16进制 其中 iv 偏移量和 key 一 ...

  4. 使用Lua脚本通过原子减防止超卖

    需求 双十二要搞一个一分钱门票抢购的活动. 分析 性能分析,抢购时会发生高并发,如果仅仅依靠Mysql数据库,有可能因为大量的请求频繁访问数据库造成服务器雪崩,所以考虑通过Redis减库存,最终的数据 ...

  5. lintcode-828. 字模式

    题目描述: 828.字模式 给定一个模式和一个字符串str,查找str是否遵循相同的模式.这里遵循的意思是一个完整的匹配,在一个字母的模式和一个非空的单词str之间有一个双向连接的模式对应. 样例 给 ...

  6. Shell字符串截取(非常详细)

    假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 1 echo ${var#*//} 其中 var 是变量名,# 号是运算符, ...

  7. Linux中git用https连接时不用每次输入密码

    应用场景: 比如每天凌晨执行crontab对应的项目部署脚本(使用git作为项目的版本控制). 如果不这样做会怎么样? 每次部署都要git clone并输入对应的用户名和密码,需要人工.这样就显得很不 ...

  8. c++笔试题 已迁移完成

    转载 1.C和C++的特点与区别? 答:(1)C语言特点:1.作为一种面向过程的结构化语言,易于调试和维护: 2.表现能力和处理能力极强,可以直接访问内存的物理地址: 3.C语言实现了对硬件的编程操作 ...

  9. Java学习-054-Mybatis IN查询,通过 foreach 获取列表数据

    通过如下语句查询商品订单信息: ,,,) 在 Mapper.java 中定义如下接口: List<GoodsOrder> findGoodsOrderByIds(String ids); ...

  10. 【GMT43智能液晶模块】例程十九:LAN_DHCP实验——动态分配IP地址

    源代码下载链接: 链接:https://pan.baidu.com/s/19Euul9LYFKYdKdXTRBfx5w 提取码:p6k8 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43 ...