【打卡】牛客网:BM79 打家劫舍(二)

资料:

dp.clear()会把dp的size变为0。 

assign和insert的对比:

v1.assign(v2.begin(), v2.end());

v1.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
v1.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值

vector的assign和insert操作实现坐标正逆序添加_std::vector assign-CSDN博客 

 dp.assign()赋值,会把dp之前的值覆盖。

c++ vector(二) insert, assign_c++ vector assign insert-CSDN博客

模板的:

我的想法是,在数组最后一个后面加上第一个,仿佛就构成了闭环。欠考虑了:第一个和最后一个只能选择一个。也就是,我的做法可能导致第一个被选择两次。

模板的,分了两种情况:选择第一个、不选择第一个。从而不需要再考虑闭环问题。

模板的疑惑:dp.clear()后不能直接dp[1]=0赋值吧?clear后数组size为0,需要用insert或者push_back。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int rob(vector& nums) {
        // write code here
        int n = nums.size();
        int res = 0;

        //选择第一个,一定不能选择最后一个
        vector dp(n);
        dp[1] = nums[0];
        for(int i = 2; i < n; i++)
            dp[i] = max(dp[i-1], dp[i-2]+nums[i-1]);
        res = max(res, dp[n-1]);

        //不选择第一个,可以选择最后一个
        vector dp2(n+1);
        for(int i = 2; i <= n; i++)
            dp2[i] = max(dp2[i-1], dp2[i-2]+nums[i-1]);
        res = max(res, dp2[n]);

        return res;
    }
};

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