【LeetCode每日一题】[中等]406. 根据身高重建队列

【LeetCode每日一题】[中等]406. 根据身高重建队列

406. 根据身高重建队列

406. 根据身高重建队列

算法思想:数组,排序

题目:

在这里插入图片描述

有两种思路:
1.身高从低到高,低的人去留空位k,找到最后的位置
2,身高从高到底,高的人先站好,矮的人去插入k

java代码

从低到高:

  1. 排序: 身高按照从低到高的顺序;k值按按照大到小的顺序
  2. 遍历人,利用人的k去找位置; k是几,前面就留几个空位;
  3. 空的位置是留给比他的高的人或者跟他一样高但k值比他小的人;
  4. 每遍历完一个人,这个人找到了最终的位置;
class Solution {
    
    
    public int[][] reconstructQueue(int[][] people) {
    
    
		//按照身高升序排列(从低到高),身高相同,k值大的排在前面
		Arrays.sort(people, new Comparator<int[]>() {
    
    
			public int compare(int[] o1, int[] o2) {
    
    
				if (o1[0] != o2[0]) {
    
    
					return o1[0] - o2[0];//身高升序
				}
				else {
    
    
					return o2[1] - o1[1];//相同,k大的排在前面
				}
			}
		});
		int n = people.length;
		int[][] res = new int[n][];//存放答案
		for (int[] p : people) {
    
    //遍历人(k值是降序)
			int count = p[1];//记录k值,用来留空位
			for (int i = 0; i < n; i++) {
    
    //一个个查找,空位表示更高或者一样高但k更小的人
				if (res[i] == null) {
    
    //遇见一个空位,count--
					count--;		
				}
				if (count == -1) {
    
    //为-1是表示没有空位需要留了,此时,i就是这个人p最后放置的位置
					res[i] = p;
					break;
				}
			}			
		}
		return res;
    }
}

从高到低:

  1. 排序: 身高按照从低高到低的顺序;k值按按照小到大的顺序
  2. 遍历人,利用人去插入; k是几,就插入到几位;
  3. 插入完场,意味着前面有k个人高的人满足条件;
class Solution {
    
    
    public int[][] reconstructQueue(int[][] people) {
    
    
    //按照身高升序排列(从高到低),身高相同,k值小的排在前面
		Arrays.sort(people, new Comparator<int[]>() {
    
    
			public int compare(int[] o1, int[] o2) {
    
    
				if (o1[0] != o2[0]) {
    
    
					return o2[0] - o1[0];
				}
				else {
    
    
					return o1[1] - o2[1];
				}
			}
		});
        //利用list更好的实现插入
		List<int[]> res = new LinkedList<int[]>();
		for (int[] p : people) {
    
    
			res.add(p[1], p);//插入到k个位置上
		}
		return res.toArray(new int[res.size()][2]);//返回新数组
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39457586/article/details/109723594
今日推荐