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);
    }
}

 

posted @ 2020-03-17 15:50  repinkply  阅读(157)  评论(0)    收藏  举报