首页 > 其他分享 >Leetcode_打家劫舍

Leetcode_打家劫舍

时间:2024-12-10 18:56:30浏览次数:6  
标签:偷窃 nums length 房屋 总金额 打家劫舍 Leetcode dp

题目:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。

思路:

如果房屋数量大于两间,应该如何计算能够偷窃到的最高总金额呢?对于第 k (k>2) 间房屋,有两个选项:

偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。

不偷窃第 k 间房屋,偷窃总金额为前 k−1 间房屋的最高总金额。

在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。

用 dp[i] 表示前 i 间房屋能偷窃到的最高总金额,那么就有如下的状态转移方程:

dp[i]=max(dp[i−2]+nums[i],dp[i−1])
边界条件为:
dp[0]=nums[0]
dp[1]=max(nums[0],nums[1])  
只有一间房屋,则偷窃该房屋
只有两间房屋,选择其中金额较高的房屋进行偷窃,最终的答案即为 dp[n−1],其中 n 是数组的长度。

代码:

class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int  length = nums.length;
        if (length == 1) {
            return nums[0];
        }
        int[] dp = new int[length];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < length; i++) {
            dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[length - 1];
    }
}

标签:偷窃,nums,length,房屋,总金额,打家劫舍,Leetcode,dp
From: https://blog.csdn.net/q15936/article/details/144380668

相关文章

  • leetcode 2779. 数组的最大美丽值
    2779.数组的最大美丽值暴力超时解......
  • leetcode 2958. 最多 K 个重复元素的最长子数组
    2958.最多K个重复元素的最长子数组classSolution{public:intmaxSubarrayLength(vector<int>&nums,intk){intsize=nums.size(),resLenth=0;unordered_map<int,int>numAdded;for(intleft=0,right=0;right<siz......
  • [LeetCode] 1524. Number of Sub-arrays With Odd Sum
    Givenanarrayofintegersarr,returnthenumberofsubarrayswithanoddsum.Sincetheanswercanbeverylarge,returnitmodulo109+7.Example1:Input:arr=[1,3,5]Output:4Explanation:Allsubarraysare[[1],[1,3],[1,3,5],[3],[3,5],[5]]Allsu......
  • 【数据结构与算法】回溯算法:LeetCode“排列问题” 求解,解释并模拟递归+回溯的遍历过程
      【作者自述:记录学习笔记,既然写了就让更多的人看到吧!欢迎大家关注交流学习,一步一个脚印持续更新!】【更多推荐笔记】【数据结构与算法】动态规划:解密“完全背包问题”的真相!附LeetCode四大问题的实现-CSDN博客【数据结构与算法】动态规划:解密“0-1背包问题”的真相!附LeetC......
  • leetcode 面试经典 150 题:验证回文串
    链接验证回文串题序号125类型字符串解题方法双指针法难度简单题目如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。字母和数字都属于字母数字字符。给你一个字符串s,如果它是回文串......
  • leetcode 258. 各位相加。数学
    258.各位相加给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。其中0≤num≤2^31-1法一:迭代classSolution{public:intaddDigits(intnum){while(num>=10){//判断千万别写成num<10intsum=0;......
  • leetcode 904. 水果成篮
    904.水果成篮说白了就是:找最多包含两种元素的最长子串,返回其长度值得注意的是,当窗口内有三种种类时,左窗口边界是要向右移动到窗口内只剩两种种类,而不是什么先进先出!比如[1,0,1,4,1,4,1,2,3] 法一:unordered_mapclassSolution{public:inttotalFruit(vector<int>&......
  • leetcode543.二叉树的直径
    给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • LeetCode题集-5 - 最长回文子串(一)
    题目:给你一个字符串 s,找到 s 中最长的回文子串。这一题作为中等难度,常规解法对于大多数人应该都没有难度。但是其中也有超难的解决办法,下面我们就一起由易到难,循序渐进地来解这道题。01、暴力破解法对于大多数题目来说,在不考虑性能的情况下,暴力破解法常常是最符合人的思维......
  • (leetcode每日一题)有效的括号
    (leetcode每日一题)有效的括号题目要求思路代码总结题目给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左......