列表

详情


BM78. 打家劫舍(一)

描述

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

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

示例1

输入:

[1,2,3,4]

输出:

6

说明:

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

示例2

输入:

[1,3,6]

输出:

7

说明:

最优方案是偷第 1,3个房间

示例3

输入:

[2,10,5]

输出:

10

说明:

最优方案是偷第 2 个房间

原站题解

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

Rust 解法, 执行用时: 20ms, 内存消耗: 5280KB, 提交时间: 2022-04-21

struct Solution{

}

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

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

C++ 解法, 执行用时: 20ms, 内存消耗: 5664KB, 提交时间: 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> 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++ 解法, 执行用时: 21ms, 内存消耗: 5760KB, 提交时间: 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 rob(vector<int>& nums) {
        if(nums.size()==1)
            return nums[0];
        vector<int>dp(nums.size());
        dp[0]=nums[0];
        dp[1]=max(nums[0],nums[1]);
        for(int i=2;i<nums.size();i++)
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        return dp[nums.size()-1];
    }
};

C++ 解法, 执行用时: 26ms, 内存消耗: 6524KB, 提交时间: 2022-02-09

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

C++ 解法, 执行用时: 27ms, 内存消耗: 5676KB, 提交时间: 2022-02-10

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

上一题