当前位置:首页 > 力扣 > 70.爬楼梯|三步破解动态规划核心奥秘

70.爬楼梯|三步破解动态规划核心奥秘

2周前 (05-14)

70.爬楼梯|三步破解动态规划核心奥秘 力扣 C++ 动态规划 算法 第1张

题意新解:

站在楼梯底仰望n级台阶,每步可选1或2阶,最终的路径组合犹如斐波那契数列般展开。比如到达第3阶的路径可由第1阶跨两步,或第2阶跨一步构成,这种递推规律揭示了两两相邻状态间的紧密关联。


思路解析:

采用‌动态规划‌策略,构建数组f存储子问题解:

1‌.状态定义‌:f[i]表示到达第i阶的方案数

2‌.边界条件‌:初始状态f[0]=1(平地不动)、f[1]=1(单步直达)

3‌.状态转移‌:循环计算f[i] = f[i-1] + f[i-2],将问题分解为前一级和前两级的子问题之和

4‌.空间特性‌:线性数组存储中间结果,时间复杂度O(n),空间复杂度O(n)

通过递推填充数组,最终直接返回f[n],避免递归开销,通过表格记录保证每个状态仅计算一次。


注释代码:

class Solution {
public:
    int climbStairs(int n) {
        int f[100];          // 定义DP数组,预留足够空间(题目n≤45)
        f[0] = 1;            // 初始状态:0阶视为1种方案(数学定义需要)
        f[1] = 1;            // 边界条件:到达第1阶仅有1种走法
        
        for(int i = 2; i <= n; i++) {
            f[i] = f[i-1] + f[i-2];  // 状态转移:合并前两阶的可能性
        }
        
        return f[n];         // 返回第n阶的总方案数
    }
};


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣912排序题终极解法:递归分割 + 双指针合并详解

力扣912排序题终极解法:递归分割 + 双指针合并详解

题目解读给定一个整数数组,要求将其按升序排列并返回。题目通常隐含对算法时间复杂度的要求,理想情况下需实现 O(n log n) 的时间复杂度。本题看似简单,但需要选择合适的排序算法(如归并排序、快速排...

力扣198.打家劫舍|动态规划解法中的特殊边界处理

力扣198.打家劫舍|动态规划解法中的特殊边界处理

题意解析:在排列成直线的房屋群中,每个房屋藏有价值不同的财物。小偷不能连续抢劫相邻的两间房屋,否则会触发警报。我们需要设计一套抢劫策略,使得在不触发警报的前提下,能够获取的最大财物总和。这个问题本质上...

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

题目重解给定一个字符串,将字符按照出现频率降序排列。例如输入"tree",可能返回"eetr"或"eert"。题目要求我们不考虑字母顺序,只...

力扣第92题:三步定位 精准反转链表指定区间

力扣第92题:三步定位 精准反转链表指定区间

题目解读给定一个单链表和两个整数left与right,要求将链表中从第left个节点到第right个节点的部分进行反转,而保持其他部分不变。例如,对于链表1→2→3→4→5,left=2,right=...

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。