思路
先对数组进行排序,身高按降序,第二个数按升序。如:
[[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
思路
思路很简单,贪心就完了。关键如何实现。
可以维护当前能够到达的最大下标位置,记为边界。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加 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