LeetCode第213題:打家劫舎II(C++)

830 ワード

213.家を略奪するII-力扣(LeetCode)
LeetCode第198題:打家劫舎(C++)qq_32523711のブログ-CSDNブログの拡張.
配列の首尾は1つの輪なので、首尾も隣接しています.1つ目の考えは、輪かどうかにかかわらず、どうせ1つ目と最後の1つが同時に奪うことができないことだ.
では,シーケンスを0~n−1,1~nの2つの部分に分けてそれぞれ計算し,最後に最大値を返すとよい.
class Solution {
public:
    int rob(vector& nums) {
        if(nums.size() == 0)    return 0;
        if(nums.size() == 1)    return nums[0];
        int pre = 0, cur = 0;
        for(int i = 0; i < nums.size()-1; ++i){//0~n-1
            int tmp = cur;
            cur = max(cur, pre+nums[i]);
            pre = tmp;
        }
        int res1 = cur;

        pre = 0, cur = 0;
        for(int i = 1; i < nums.size(); ++i){//1~n
            int tmp = cur;
            cur = max(cur, pre+nums[i]);
            pre = tmp;
        }
        return max(cur, res1);
    }
};