【LeetCode】406. Queue Reconstruction by Height (with Python code)

Leetcode地址:https://leetcode.com/problems/queue-reconstruction-by-height/#/description

题目描述

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]]

题目大意

给出了一个数组,数组的每个元素表示一个人的身高以及在一个队伍前面不比他矮的人的个数。现在要重新排列,使得数组是满足条件的。

解题方法

[这部分转自于此博客]

(https://blog.csdn.net/fuxuemingzhu/article/details/68486884) 考虑如果先把个子高的排好序,那么在任何位置插入数据都不会对已经排好序的数组造成影响。而,与此同时,我们已经知道了个子高的排序,那么当新的数据到的时候,我们要确定它的位置也很简单,因为现在的所有数据都比他高,所以只要根据他的第二个数字确定他的位置即可。

先对已有的数组进行排序。按照高度降序排列,如果高度一样,按照k的值升序排列。这样比如一开始[7,0] [7,1] [7,2]就会排好,然后比如说后面有一个[6,1], 说明只有一个大于或等于它,又因为比6大的已经全部取出。所以把它放在位置1,这样就变成[7,0] [6,1] [7,1] [7,2].然后比如又有一个[5,0].就放在位置0,以此类推。

即对于案列。首先排序成:

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

 
 

    然后对于第二个数字进行插入对应位置:

    [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
    
     
     
      ## Python:
      
      N = int(input().strip())
      queue = []
      for i in range(N):
          lili = [int(i) for i in input().strip().split()]
          queue.append(lili)
      
      queue.sort(key = lambda x: (-x[0],x[1]))  # x[0]先降序排, 再x[1]升序排
      # print(queue)
      
      # insertion sort
      for i in range(1,len(queue)):
          if queue[i][1] != i and queue[i][0]<queue[i-1][0]:
              ord = queue[i][1]
              queue[ord],queue[ord+1:i+1] = queue[i],queue[ord:i]
              # print('i=',i,queue)
      
      for i in queue:
          print(i[0],i[1])
      
      
      
      • 0
        点赞
      • 0
        收藏
        觉得还不错? 一键收藏
      • 0
        评论

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

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

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值