摒弃世俗浮躁
追求技术精湛

【力扣】70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶

示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶

提示:

  • 1 <= n <= 45

题解:

动态规划(斐波那契数列方法,未优化):

func climbStairs(n int) int {
	if n < 3 {
		return n
	}
	// dp[i]定义:达到第 i 个台阶有 dp[i] 种方法
	dp := make([]int, n+1)
	dp[1] = 1
	dp[2] = 2
	for i := 3; i <= n; i++ {
		// 递推公式
		dp[i] = dp[i-1] + dp[i-2]
	}
	return dp[n]
}

动态规划(斐波那契数列方法,优化版本):

func climbStairs(n int) int {
	if n < 3 {
		return n
	}
	// dp[i]定义:达到第 i 个台阶有 dp[i] 种方法
	a, b, c := 1, 2, 0
	for i := 3; i <= n; i++ {
		// 递推公式
		c = a + b
		a, b = b, c
	}
	return c
}

动态规划(完全背包,优化版本):

func climbStairs(n int) int {
	weight := []int{1, 2}
	dp := make([]int, n+1)
	dp[0] = 1
	// 求排列是先遍历背包,再遍历物品
	// 求组合是先遍历物品,再遍历背包
	// 这里先遍历背包
	for j := 0; j <= n; j++ {
		// 遍历物品
		for i := 0; i < len(weight); i++ {
			if j >= weight[i] {
				// 状态转移公式
				dp[j] += dp[j-weight[i]]
			}
		}
	}
	return dp[n]
}
赞(0) 打赏
未经允许不得转载:时光日记 » 【力扣】70. 爬楼梯

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册