当前位置:网站首页>406. 根据身高重建队列
406. 根据身高重建队列
2022-07-03 14:47:00 【酱酱熊】
题目链接
分析:题目意思是要我们将一个数组 people[i] = {h,k},放到一个位置,并且能保证,这个位置前面有k个h大于等于当前h的。
首先说一下需要使用到的变量:
res[][]:用来记录最终答案的二维数组
vis[]:用来记录这个位置是否已经放置了元素
count:用来记录前面有几个大于等于当前h的元素
那么我们可以反过来想,首先找到一个最小的h,那么其它的h肯定比当前大,那么只需要考虑前面有k个位置就行,也就是说,当前这个放到第k+1个位置就行。(这里为了简单,先没考虑有相同的h)
下面我们再考虑有相同h的情况。
其实也很好考虑。
我们从res的第0个开始遍历,当count还小于k的时候,那么说明还要继续往后遍历,因为还没找到合适的位置。
那么什么时候count自增呢,也就是说,什么时候才叫找到了一个大于等于当前h的位置呢?
第一:遍历到当前位置没有被访问,因为每次我们都需要拿出people中剩下的最小的,所以,还没有被访问的肯定是放后面元素的,所以肯定是大于等于当前h的,此时count+1.
第二:遍历到元素等于当前h,也就是有相同h存在的情况,此时也是count+1。
直到People都放到了res即可。
那么此时还有两个问题
问题一:就是我们每次怎么去找h最小的?
问题二:并且如果当前剩下的people中最小的h有多个,应该选择哪一个?
问题一:
我们可以将people放到小顶堆中,这样每次拿到的就是h最小的。
问题二:
如果h相同,那么我们应该选择k最小的,因为h相同,k最小的肯定放在前面。
代码:
class Solution {
public int[][] reconstructQueue(int[][] people) {
//小顶堆 h小的放上面, h相同则k小的放上面
Queue<int[]> queue = new PriorityQueue<>((i1,i2)->{
if(i1[0]!=i2[0]){
return i1[0]-i2[0];
}else{
return i1[1]-i2[1];
}
});
int n = people.length;
int[][] res = new int[n][2];
//记录这个位置是否被访问过
boolean[] vis = new boolean[n];
for(int i=0; i<n; i++){
queue.offer(people[i]);
}
while(!queue.isEmpty()){
int[] top = queue.poll();
int count=0;
int i=0;
while(i<n && count<top[1]){
//这个位置没被访问过 或者 这个位置访问过了,但是h相等
if(!vis[i] || res[i][0]==top[0]){
count++;
}
i++;
}
while(vis[i]){
i++;
}
res[i] = top;
vis[i] = true;
}
return res;
}
}
边栏推荐
- Tonybot Humanoïde Robot Infrared Remote play 0630
- 洛谷P4047 [JSOI2010]部落划分 题解
- 从书本《皮囊》摘录的几个句子
- NFT new opportunity, multimedia NFT aggregation platform okaleido will be launched soon
- Zzuli:1043 max
- Qt—绘制其他东西
- 关于敏捷的一些概念
- QT - draw something else
- Talking about part of data storage in C language
- Zhonggan micro sprint technology innovation board: annual revenue of 240million, net loss of 17.82 million, proposed to raise 600million
猜你喜欢

On MEM series functions of C language

Dllexport et dllimport

Implement Gobang with C language

C language to realize mine sweeping

Talking about part of data storage in C language

零拷贝底层剖析
![洛谷P5018 [NOIP2018 普及组] 对称二叉树 题解](/img/89/da1a3a38e02671628f385de0f30369.png)
洛谷P5018 [NOIP2018 普及组] 对称二叉树 题解

My QT learning path -- how qdatetimeedit is empty

pyQt界面制作(登录+跳转页面)

ShowMeBug入驻腾讯会议,开启专业级技术面试时代
随机推荐
Zzuli:1043 max
Luogu p5194 [usaco05dec]scales s solution
tonybot 人形机器人 定距移动 代码编写玩法
NFT new opportunity, multimedia NFT aggregation platform okaleido will be launched soon
Dllexport and dllimport
Zzuli:1040 sum of sequence 1
【北大青鸟昌平校区】互联网行业中,哪些岗位越老越吃香?
1017 a divided by B (20 points)
retrofit
链表有环,快慢指针走3步可以吗
Zzuli: sum of 1051 square roots
Address book sorting
Some concepts about agile
Niuke bm83 string deformation (case conversion, string inversion, string replacement)
Introduction to opengl4.0 tutorial computing shaders
亚马逊、速卖通、Lazada、Shopee、eBay、wish、沃尔玛、阿里国际、美客多等跨境电商平台,测评自养号该如何利用产品上新期抓住流量?
Mongodb index
7-1 positive integer a+b (15 points)
NOI OPENJUDGE 1.4(15)
天谋科技 Timecho 完成近亿元人民币天使轮融资,打造工业物联网原生时序数据库