Mar.24 根据身高重建队列(中等)& 跳跃游戏II(中等)

406. 根据身高重建队列
在这里插入图片描述

思路

先对数组进行排序,身高按降序,第二个数按升序。如:

[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
变成:
[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]

创建一个数组tmp来存放结果。

      [[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
         ↓ tmp的长度为0,小于等于[7,0]中的0,因此直接插入tmp的尾部
tmp = [[7,0]                             ]
-----------------------------------------------------------------

      [[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
               ↓ tmp的长度为1,小于等于[7,1]中的1,因此直接插入tmp的尾部
tmp = [[7,0],[7,1]                       ]
-----------------------------------------------------------------

[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]
               ↓ tmp的长度为3,大于等于[6,1]中的1,因此直接插入tmp的index=1的位置
tmp = [[7,0],[6,1],[7,1]                 ]
----------------------------------------------------------------
以此类推...
# python3
class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        if len(people) < 2:
            return people
        tmp = list()
        people = sorted(people, key=lambda x : (-x[0], x[1]))
        for i in people:
            if i[1] >= len(tmp):
                tmp.append(i)
            else:
                tmp.insert(i[1], i)
        return tmp
        

45. 跳跃游戏 II
在这里插入图片描述

思路

思路很简单,贪心就完了。关键如何实现。
可以维护当前能够到达的最大下标位置,记为边界。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加 1。
在遍历数组时,我们不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个位置,否则就无法跳到最后一个位置了。如果访问最后一个元素,在边界正好为最后一个位置的情况下,我们会增加一次「不必要的跳跃次数」,因此我们不必访问最后一个元素。

class Solution:
    def jump(self, nums: List[int]) -> int:
        n = len(nums)
        maxPos, end, step = 0, 0, 0
        for i in range(n - 1):
            if maxPos >= i:
                maxPos = max(maxPos, i + nums[i])
                if i == end:
                    end = maxPos
                    step += 1
        return step
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值