funcminCostClimbingStairs(cost []int)int{
n :=len(cost)if n ==0{return0}if n ==1{return cost[0]}
prevPrev, prev := cost[0], cost[1]for i :=2; i < n; i++{
current := cost[i]+min(prev, prevPrev)
prevPrev, prev = prev, current
}returnmin(prev, prevPrev)}funcmin(a, b int)int{if a < b {return a
}return b
}
二、算法分析
1. 核心思路
滚动数组优化:仅维护前两个状态值
状态转移方程:dp[i] = cost[i] + min(dp[i-1], dp[i-2])
边界处理:
直接处理n=0和n=1的特殊情况
通过滚动变量避免O(n)空间复杂度
2. 关键步骤
初始化状态:prevPrev=cost[0], prev=cost[1]
迭代计算:
计算当前台阶的最小花费
更新前两个状态值
结果返回:取最后两个状态的最小值
3. 复杂度
指标
值
说明
时间复杂度
O(n)
线性遍历整个数组
空间复杂度
O(1)
仅使用三个临时变量
三、图解示例
四、边界条件与扩展
1. 特殊场景验证
空数组:返回0(题目约束通常不存在)
单台阶数组:直接返回cost[0]
两台阶数组:取cost[0]和cost[1]较小值
大数测试:n=1000时仍能高效计算
2. 扩展应用
建筑成本优化:规划多层建筑的最优建造路径
游戏AI寻路:动态计算移动消耗最小的路径
投资决策:多阶段投资的最小成本路径选择
3. 多语言实现
classSolution{publicintminCostClimbingStairs(int[] cost){int n = cost.length;if(n ==1)return cost[0];int a = cost[0], b = cost[1];for(int i =2; i < n; i++){int c = cost[i]+Math.min(a, b);
a = b;
b = c;}returnMath.min(a, b);}}
classSolution:defminCostClimbingStairs(self, cost: List[int])->int:iflen(cost)==1:return cost[0]
prev_prev, prev = cost[0], cost[1]for i inrange(2,len(cost)):
current = cost[i]+min(prev_prev, prev)
prev_prev, prev = prev, current
returnmin(prev_prev, prev)