1345 跳跃游戏 IV
给一个整数数组 arr ,一开始在数组的第一个元素处(下标为 0)。 每一步,你可以从下标 i 跳到下标:
- i + 1 满足:i + 1 < arr.length
- i - 1 满足:i - 1 >= 0
- j 满足:arr[i] == arr[j] 且 i != j
请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。
注意:任何时候你都不能跳到数组外面。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game-iv
# 等值跳或左右跳,DFS
class Solution:
def minJumps(self, arr: List[int]) -> int:
idx_map, steps = defaultdict(list), [len(arr) - 1] * len(arr)
for i, num in enumerate(arr):
idx_map[num].append(i)
queue = deque([0])
steps[0] = 0
while queue:
idx = queue.popleft()
if idx == len(arr) - 1:
break
nxt_step = steps[idx] + 1
idx_map[arr[idx]] += [idx+1,idx-1] if idx else [idx+1]
while idx_map[arr[idx]]:
if steps[(other:=idx_map[arr[idx]].pop())] > nxt_step:
steps[other] = nxt_step
queue.append(other)
return steps[-1]
#作者:himymBen
#链接:https://leetcode-cn.com/problems/jump-game-iv/solution/pythonjavajavascriptgo-bfs-by-himymben-2l8g/
#来源:力扣(LeetCode)
735 行星碰撞
给定一个整数数组 asteroids,表示在同一行的行星。
对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。
找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/asteroid-collision
输入:asteroids = [10,2,-5]
输出:[10]
解释:2 和 -5 发生碰撞后剩下 -5 。10 和 -5 发生碰撞后剩下10 。
输入:asteroids = [-2,-1,1,2]
输出:[-2,-1,1,2]
解释:-2 和 -1 向左移动,而 1 和 2向右移动。 由于移动方向相同的行星不会发生碰撞,所以最终没有行星发生碰撞。
class Solution(object):
def asteroidCollision(self, asteroids):
ans = []
for new in asteroids:
while ans and new < 0 < ans[-1]:
if ans[-1] < -new:
ans.pop()
continue
elif ans[-1] == -new:
ans.pop()
break
else:
ans.append(new)
return ans
#作者:LeetCode
#链接:https://leetcode-cn.com/problems/asteroid-collision/solution/xing-xing-peng-zhuang-by-leetcode/