leetcode 406. Queue Reconstruction by Height

257 篇文章 17 订阅

Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k), where h is the height of the person and k is the number of people in front of this person who have a height greater than or equal to h. Write an algorithm to reconstruct the queue.

Note:
The number of people is less than 1,100.

Example

Input:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

Output:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
我的思路是先将所有人按身高从高到矮排序,身高一样的话,后面的数小的排前面。然后遍历,当遍历到一个元素i时,再从0开始找i之前有哪些元素比i的身高大,当已找出了i[1]个元素时,将i插进那个元素后面。

public class Queue_Reconstruction_by_Height_406 {
	
	public int[][] daoxu(int[][] people){
		for(int i=0;i<people.length;i++){
			for(int j=0;j<people.length-1-i;j++){
				if(people[j][0]<people[j+1][0]||(people[j][0]==people[j+1][0]&&people[j][1]>people[j+1][1])){
					int[] temp=people[j];
					people[j]=people[j+1];
					people[j+1]=temp;
				}
			}
		}
		return people;
	}

	public int[][] reconstructQueue(int[][] people) {
		people=daoxu(people);
		for(int i=1;i<people.length;i++){
			int count=0;
			for (int j = 0; j < i; j++) {
				if(count==people[i][1]){
					int[] temp=people[i];
					for(int k=i;k>j;k--){
						people[k]=people[k-1];
					}
					people[j]=temp;
					break;
				}
				if (people[j][0] >= people[i][0]) {
					count++;
				}
			}
		}
		return people;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Queue_Reconstruction_by_Height_406 q=new Queue_Reconstruction_by_Height_406();
		int[][] a=new int[][]{{9,0},{7,0},{1,9},{3,0},{2,7},{5,3},{6,0},{3,4},{6,2},{5,2}};
		int[][] b=q.reconstructQueue(a);
		for(int i=0;i<b.length;i++){
			System.out.print("("+b[i][0]+","+b[i][1]+") ");
		}
	}

}

发现大神的思路跟我差不多,但是后面是采用的链表插入的方式,比我这个更快。而且i[1]等于多少,就把它填入第i[1]个元素,这个很机智,因为在i前面的元素都是身高比i高的,就算i插在它们前面,对它们的[1]值不会有影响。

public class Solution {
    public int[][] reconstructQueue(int[][] people) {
        //pick up the tallest guy first
        //when insert the next tall guy, just need to insert him into kth position
        //repeat until all people are inserted into list
        Arrays.sort(people,new Comparator<int[]>(){
           @Override
           public int compare(int[] o1, int[] o2){
               return o1[0]!=o2[0]?o2[0]-o1[0]:o1[1]-o2[1];
           }
        });
        List<int[]> res = new LinkedList<>();
        for(int[] cur : people){
            res.add(cur[1],cur);       
        }
        return res.toArray(new int[people.length][]);
    }
}

We first sort the people to make them stand from the highest to shortest. For people with same height, sort them according to the count of people before them from small to big.
Then, we use the way similar to insert sorting to reorder the people. For a given person to insert, all the people already sorted are higher, so we just insert him in the "right" place to make the people before him as his "count" indicates. Since he is shorter than all the people in the sorted list, the "count" of the "existing" people does not be broken by the insertion.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于LeetCode上的问题994.腐烂的橘子,你可以使用Python来解决。下面是一个示例代码: ```python from collections import deque def orangesRotting(grid): # 记录网格的行数和列数 row, col = len(grid), len(grid[0]) # 定义四个方向:上、下、左、右 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 使用队列来保存腐烂的橘子的位置 queue = deque() # 记录新鲜橘子的数量 fresh_count = 0 # 遍历整个网格,初始化队列和新鲜橘子的数量 for i in range(row): for j in range(col): if grid[i][j] == 2: # 腐烂的橘子 queue.append((i, j)) elif grid[i][j] == 1: # 新鲜橘子 fresh_count += 1 # 如果新鲜橘子的数量为0,直接返回0 if fresh_count == 0: return 0 # 初始化分钟数 minutes = 0 # 开始进行BFS,直到队列为空 while queue: # 记录当前分钟数下,队列中的元素数量 size = len(queue) # 遍历当前分钟数下的所有腐烂的橘子 for _ in range(size): x, y = queue.popleft() # 遍历四个方向 for dx, dy in directions: nx, ny = x + dx, y + dy # 判断新位置是否在网格内,并且是新鲜橘子 if 0 <= nx < row and 0 <= ny < col and grid[nx][ny] == 1: # 将新鲜橘子变为腐烂状态 grid[nx][ny] = 2 # 将新鲜橘子的位置加入队列 queue.append((nx, ny)) # 新鲜橘子的数量减1 fresh_count -= 1 # 如果当前分钟数下,没有新鲜橘子了,结束循环 if fresh_count == 0: break # 每遍历完一层,分钟数加1 minutes += 1 # 如果最后还有新鲜橘子,返回-1,否则返回分钟数 return -1 if fresh_count > 0 else minutes ``` 你可以将给定的网格作为参数传递给`orangesRotting`函数来测试它。请注意,该代码使用了BFS算法来遍历橘子,并计算腐烂的分钟数。希望能对你有所帮助!如果有任何疑问,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值