509. 斐波那契数
方法一:递归
func fib(n int) int {
if n==0{
return 0
}
if n==1{
return 1
}
return fib(n-1)+fib(n-2)
}
方法二:动态规划
func fib(n int) int {
dp:=make([]int,n+2)
dp[0]=0
dp[1]=1
if n < 2{
return dp[n]
}
for i:=2;i<=n;i++{
dp[i]=dp[i-1]+dp[i-2]
}
return dp[n]
}
70. 爬楼梯
func climbStairs(n int) int {
dp:=make([]int,n+2)
dp[1]=1
dp[2]=2
if n<3{
return dp[n]
}
for i:=3;i<=n;i++{
dp[i]=dp[i-1]+dp[i-2]
}
return dp[n]
}
746. 使用最小花费爬楼梯
func minCostClimbingStairs(cost []int) int {
//dp[i]是到达第i层最低花费
dp:=make([]int,len(cost))
dp[0]=cost[0]
dp[1]=cost[1]
for i:=2;i<len(cost);i++{
dp[i]=min(dp[i-1],dp[i-2])+cost[i]
}
return min(dp[len(cost)-1],(dp[len(cost)-2]))
}
func min(a,b int)int{
if a < b{
return a
}
return b
}
121. 买卖股票的最佳时机
func maxProfit(prices []int) int {
dp:=make([][]int,len(prices))
for j:=0;j<len(prices);j++{
dp[j]=make([]int,2)
}
dp[0][0]=-prices[0]
dp[0][1]=0
for i:=1;i<len(prices);i++{
//dp[i][0]是第i天持有股票所得的最多现金
dp[i][0]=max(dp[i-1][0],-prices[i])
//dp[i][1]是第i天不持有股票所得的最多现金
dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0])
}
return dp[len(prices)-1][1]
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
122. 买卖股票的最佳时机 II
func maxProfit(prices []int) int {
dp:=make([][]int,len(prices))
for j:=0;j<len(prices);j++{
dp[j]=make([]int,2)
}
dp[0][0]=-prices[0]
dp[0][1]=0
for i:=1;i<len(prices);i++{
//dp[i][0]是第i天持有股票所得的最多现金
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i])
//dp[i][1]是第i天不持有股票所得的最多现金
dp[i][1]=max(dp[i - 1][1], dp[i - 1][0] + prices[i])
}
return dp[len(prices)-1][1]
}
func max(a,b int)int{
if a>b{
return a
}
return b
}
123. 买卖股票的最佳时机 III
func maxProfit(prices []int) int {
dp:=make([][]int,len(prices))
for j:=0;j<len(prices);j++{
dp[j]=make([]int,5)
}
// 0 无操作
// 1 第一次买入
// 2 第一次卖出
// 3 第二次买入
// 4 第二次卖出
dp[0][0]=0
dp[0][1]=-prices[0]
dp[0][2]=0
dp[0][3]=-prices[0]
dp[0][4]=0
for i:=1;i<len(prices);i++{
dp[i][0]=dp[i-1][0]
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1])
dp[i][2]=max(dp[i-1][1]+prices[i],dp[i-1][2])
dp[i][3]=max(dp[i-1][2]-prices[i],dp[i-1][3])
dp[i][4]=max(dp[i-1][3]+prices[i],dp[i-1][4])
}
return dp[len(prices)-1][4]
}
func max(a,b int)int{
if a>b{
return a
}
return b
}