p47 使用最小花费爬楼梯(leetcode 746)
一:解题思路
这是一道动态规划题
方法一:状态d(i)表示爬到第i阶楼梯时的最小代价,d(i)=min(d(i-1),d(i-2))+c(i),初始条件,d(0)=c(0),d(1)=c(1)。最后爬到第n阶楼梯的时候,是可以由倒数第一阶楼梯爬上去的,也可以从倒数第二阶楼梯爬上去的。故最后要返回的是,min(d[n-2],d[n-1])。
方法二:滚动更新 将空间复杂度降低为:O(1)
二:完整代码示例 (C++版和Java版)
第一种方法C++:
class Solution { public: int min(int a, int b) { return a < b ? a : b; } int minCostClimbingStairs(vector<int>& cost) { if (cost.size() == 0) return 0; if (cost.size() == 1) return cost[1]; int n = cost.size(); vector<int> d(n,0); d[0] = cost[0]; d[1] = cost[1]; for (int i = 2; i < cost.size(); i++) { d[i] = min(d[i - 1], d[i - 2]) + cost[i]; } return min(d[n-1],d[n-2]); } };
第一种方法Java:
class Solution { public int minCostClimbingStairs(int[] cost) { if(cost==null||cost.length==0) return 0; if(cost.length==1) return cost[0]; int n=cost.length; int[] d=new int[n]; d[0]=cost[0];d[1]=cost[1]; for(int i=2;i<cost.length;i++) { d[i]=Math.min(d[i-1],d[i-2])+cost[i]; } return Math.min(d[n-1],d[n-2]); } }
第二种方法C++:
class Solution { public: int min(int a, int b) { return a < b ? a : b; } int minCostClimbingStairs(vector<int>& cost) { if (cost.size() == 0) return 0; if (cost.size() == 1) return cost[1]; int n = cost.size(); int first = cost[0]; int second = cost[1]; for (int i = 2; i < cost.size(); i++) { int cur = min(first,second) + cost[i]; first = second; second = cur; } return min(first, second); } };
第二种方法Java:
class Solution { public int minCostClimbingStairs(int[] cost) { if(cost==null||cost.length==0) return 0; if(cost.length==1) return cost[0]; int n=cost.length; int first=cost[0]; int second=cost[1]; for(int i=2;i<cost.length;i++) { int cur=Math.min(first,second)+cost[i]; first=second; second=cur; } return Math.min(first,second); } }

浙公网安备 33010602011771号