1.跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
方法一:贪心算法
#方法一:贪心算法
def canJump(nums):
if nums==[0]: #特殊情况单独判断
return True
max_d=0
for i in range(len(nums)):
if max_d>=i and i+nums[i]>max_d: #如果最大跳跃位置比当前位置大,并且当前位置加上跳跃数目比最大跳跃位置大
max_d=i+nums[i] #那么就进行更新
if max_d>=len(nums)-1: #超出了最大范围则一定可以跳到
return True
return False
方法二:动态规划
#方法二:动态规划
def canJump(nums):
dp=[0 for i in range(len(nums))]
dp[0]=nums[0]
for i in range(1,len(nums)):
if dp[i-1]>=i: #dp[i]表示i位置之前所能跳到的最远位置
dp[i]=max(dp[i-1],i+nums[i]) #最远位置
else:
dp[i]=dp[i-1] #保持不变
return dp[-1]>=len(nums)-1
2.不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
方法一:动态规划
#方法一:动态规划
def uniquePaths(m,n):
dp=[[0]*n for i in range(m)]
for i in range(m):
dp[i][0]=1 #边界情况只有一种走法
for i in range(n):
dp[0][i]=1
for i in range(1,m):
for j in range(1,n):
dp[i][j]=dp[i][j-1]+dp[i-1][j] #dp[i][j]表示在该位置的方法数
return dp[m-1][n-1] #等于上一格和左边一格的方法数和