力扣-406根据身高重建队列(medium)

题目

1.描述

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

2.示例

输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

3.思路

  • 需要先考虑高个子, 因为对于数据[6,1] [7,0] [7,1],若先考虑小个子,[7,0] [6,1][6,1]已经在合适位置上, 但若再加入数据[7,1], [6,1]的位置需要发生改变.
  • 按照身高h的降序, 人数k的升序对二维数组进行排序
  • 排序后即可使用贪心算法, 每次选取最高的人p, 并将他安排到p[1]位置

4.代码

public int[][] reconstructQueue(int[][] people) {
    if (people == null || people.length == 0 || people[0].length == 0)
		return new int[0][0];
	Arrays.sort(people, new Comparator<int[]>() {

		// 按照身高降序,个数K升序进行排序,最后将某个学生插入下标为K的位置即可
		@Override
		public int compare(int[] a, int[] b) {
			return a[0] == b[0] ? a[1] - b[1] : b[0] - a[0];
		}
	});

	List<int[]> queue = new ArrayList<>();
	for (int[] p : people) {
		queue.add(p[1], p);
	}
	return queue.toArray(new int[queue.size()][]);
}

笔记:

  • List接口中的add方法: 对于add(i,v),可将元素v添加至List的i位置, 但前提是i之前的位置中元素都不为空.
  • 对于上述的add方法,若进行以下操作:list.add(0,1);list.add(1,2);list.add(0,3)后,list内容为[3,1,2]。即,当向同一个位置插入元素时,原有元素将会后移

参考: 链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值