列表

详情


BM79. 打家劫舍(二)

描述

你是一个经验丰富的小偷,准备偷沿湖的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家,如果偷了第二家,那么就不能偷第一家和第三家。沿湖的房间组成一个闭合的圆形,即第一个房间和最后一个房间视为相邻。
给定一个长度为n的整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。

数据范围:数组长度满足 ,数组中每个值满足

示例1

输入:

[1,2,3,4]

输出:

6

说明:

最优方案是偷第 2 4 个房间

示例2

输入:

[1,3,6]

输出:

6

说明:

由于 1 和 3 是相邻的,因此最优方案是偷第 3 个房间

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 22ms, 内存消耗: 5724KB, 提交时间: 2022-08-02

const auto io_sync_off=[]() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int rob(vector<int>& nums) {
        // write code here
        vector<int> nums1(nums.begin(), nums.end() - 1);
        vector<int> nums2(nums.begin() + 1, nums.end());
        return max(rob__(nums1), rob__(nums2));
    }
    
private:
    int rob__(vector<int>& nums) {
        vector<int> dp(nums.size() + 3);
        for (int i = nums.size() - 1; i >= 0; i--)
            dp[i] = nums[i] + max(dp[i+2], dp[i+3]);
        return max(dp[0], dp[1]);
    }
};

C++ 解法, 执行用时: 22ms, 内存消耗: 6808KB, 提交时间: 2022-07-25

static const auto io_sync_off = [](){
    std::ios::sync_with_stdio(false);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
    return nullptr;
}();
class Solution {
public:
    int robR(vector<int>& nums,int start,int end)
    {
        if(end==start)
            return nums[start];
        vector<int>dp(nums.size());
        dp[start]=nums[start];
        dp[start+1]=max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++)
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        return dp[end];
    }
    int rob(vector<int>& nums) {
        if(nums.size()==1)
            return nums[0];
        int res1=robR(nums,0,nums.size()-2);
        int res2=robR(nums,1,nums.size()-1);
        return max(res1,res2);
    }
};

Rust 解法, 执行用时: 23ms, 内存消耗: 5260KB, 提交时间: 2022-04-08

struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param nums int整型一维数组 
        * @return int整型
    */
    pub fn rob(&self, nums: Vec<i32>) -> i32 {
        let n = nums.len();
        match n {
            1 => nums[0],
            2 => nums[0].max(nums[1]),
            _ => self.rob_range(&nums, 0usize, n-2).max(self.rob_range(&nums, 1usize, n-1)),
        }
    }
    
    fn rob_range(&self, nums: &Vec<i32>, s :usize, e :usize) -> i32 {
        let mut last1 = 0i32;
        let mut last2 = 0i32;
        for i in (s..=e).rev() {
            let tmp = last2.max(last1 + nums[i]);
            
            last1 = last2;
            last2 = tmp;
        }
        
        last2
    }
}

C++ 解法, 执行用时: 24ms, 内存消耗: 5688KB, 提交时间: 2021-12-07

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int rob(vector<int>& nums) {
        // write code here
        int n = nums.size();
        if(n <= 0) return 0;
        if(n == 1) return nums[0];
        if(n == 2) return max(nums[0],nums[1]);
        return max(rob2(nums,0,n-2),rob2(nums,1,n-1));
    }
    int rob2(vector<int>& nums, int start, int end)
    {
        if(start >= end) return 0;
        int rob = 0, no_rob = 0;
        for(int i = start; i <= end; i++)
        {
            int rob_ = no_rob + nums[i];
            no_rob = max(rob,no_rob);
            rob = rob_;
        }
        return max(rob,no_rob);
    }
};

C++ 解法, 执行用时: 25ms, 内存消耗: 5644KB, 提交时间: 2022-01-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int robNum(vector<int>& nums, int start, int end) {
        int n = nums.size();
        vector<int> dp(n - 1, 0);
        dp[0] = nums[start];
        dp[1] = max(nums[start], nums[start + 1]);
        dp[2] = max(nums[start] + nums[start + 2], nums[start + 1]);
        for (int i = 3; i < n - 1; i++) {
            dp[i] = max(dp[i - 2], dp[i - 3]) + nums[i + start];
        }
        return max(dp[n - 2], dp[n - 3]);
    }
    int rob(vector<int>& nums) {
        // write code here
        int n = nums.size();
        if (n == 1) return nums[0];
        if (n == 2) return max(nums[0], nums[1]);
        if (n == 3) return max(nums[0], max(nums[2], nums[1]));
        int result1 = robNum(nums, 0, n - 2);
        int result2 = robNum(nums, 1, n - 1);
        return max(result1, result2);
    }
};

上一题