LeetCode 746. 使用最小花费爬楼梯

接着斐波那契&爬楼梯的一道动态规划题。

解题

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        int n = cost.size();
        vector<int> mintotal(n+1);
        mintotal[0] = cost[0];
        mintotal[1] = cost[1];
        cost.push_back(0);
        if(n >= 2)
        {
            for(int i = 2; i <= n; ++i)
            {
                mintotal[i] = min(mintotal[i-1], mintotal[i-2]) + cost[i];
            }
        }
        return mintotal[n];

    }
};

本题思路与踩坑

  1. 复习一下vector的插入操作:
a.push_back(i);            //最简单的插入,直接向vector末尾加入一个数据
a.insert(pos,elem);        //向pos迭代器指向的对象前插入一个对象,注意是对象前
a.insert(pos, n, elem);    //向pos迭代器指向的对象前插入n个相同对象
a.insert(pos, begin, end); //向pos迭代器指向的对象前插入[begin,end)之间的对象
后三个函数都会返回新数据的位置

刚开始写的时候cost[n]未初始化,导致有部分测试用例没通过。

  1. 关于n=2的时候。一开始 if(n >= 2)的等号没带上。
  2. 本题要注意n/n+1/size之类的下标问题
  3. 在写的过程中,老是出现一些其他的想法,比如认为到底是哪一步花费体力,是爬上⼀个台阶就要花费对应的体力值,还是过了之后再把刚刚那阶付掉。其实是两种思路,都可以,比如另一种写法(过了在以后再付)是这样的:
classSolution{
public:
	intminCostClimbingStairs(vector<int>&cost) {
		vector<int> dp(cost.size()+1);dp[0] = 0;//默认第⼀步都是不花费体⼒的dp[1]=0;
		for(int i=2; i<= cost.size(); i++) {
			dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
		}
		return dp[cost.size()];
	}
};

你可能感兴趣的:(leetcode,leetcode,算法,数据结构)