首页 > 其他分享 >【DP】LeetCode 198. 打家劫舍

【DP】LeetCode 198. 打家劫舍

时间:2023-04-25 10:58:11浏览次数:53  
标签:表示 198 nums int DP 数组 LeetCode dp

题目链接

198. 打家劫舍

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 nums1 前 i 个元素(即 nums1[i - 1])组成和以 nums2 前 j 个元素(即 nums2[j - 1])组成的状态,以此类推

字符串也是个数组,是字符数组

表示状态

状态表示就是靠猜,但是会有猜的套路,一般都是通过最终结果和数组数量来猜

找状态转移方程

思考的方向是:大问题的最优解怎么由小问题的最优解得到

边界处理

空间优化

代码

dp数组版

class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        // dp[i] 表示前 i 个房屋能打劫到的金额
        int[] dp = new int[n + 1];

        dp[1] = nums[0];
        for(int i = 2; i <= n; i++){
            // 不选 nums[i - 1]和选 nums[i - 1] 之间取最大值
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i - 1]);
        }

        return dp[n];
    }
}

空间优化版

class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        // dp[i] 表示前 i 个房屋能打劫到的金额
        // pre1 表示 dp[i - 2]
        int pre1 = 0;
        // pre2 表示 dp[i - 1]
        int pre2 = nums[0];
        int current = 0;

        for(int i = 2; i <= n; i++){
            // 不选 nums[i - 1]和选 nums[i - 1] 之间取最大值
            current = Math.max(pre2, pre1 + nums[i - 1]);
            pre1 = pre2;
            pre2 = current;
        }

        return pre2;
    }
}

标签:表示,198,nums,int,DP,数组,LeetCode,dp
From: https://www.cnblogs.com/shixuanliu/p/17351959.html

相关文章

  • leetcode(2)
    Given n pointsona2Dplane,findthemaximumnumberofpointsthatlieonthesamestraightline.在一条直线上最多的点。理解错了:理解成一条直线上距离最长的点(自己见过类似题,务必审题要细!!!!)4.1hash_map和map的区别在哪里?构造函数。hash_map需要hash函数,......
  • 拒绝“千人一面”!使用CDP实现市场细分助力GMV增长
    哈佛商学院在美国进行的一项调查发现,95%的新品牌失败是由于无效的营销细分,其失败的原因在于每个消费者都是独立的个体,他们也有着独特的要求。因此,千人一面的营销策略无法吸引所有用户。而成功品牌总是会向正确的消费者提供正确的产品,为此,营销人员需要彻底了解他们的客户,市场细分可......
  • 【DP】LeetCode 1277. 统计全为 1 的正方形子矩阵
    题目链接1277.统计全为1的正方形子矩阵思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1......
  • 【LeetCode动态规划#12】详解买卖股票I~IV,经典dp题型
    买卖股票的最佳时机力扣题目链接(opensnewwindow)给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔......
  • #yyds干货盘点# LeetCode程序员面试金典:搜索插入位置
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输出:1示......
  • #yyds干货盘点# LeetCode面试题:分隔链表
    1.简述:给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,使得所有小于x的节点都出现在大于或等于x的节点之前。你应当保留两个分区中每个节点的初始相对位置。 示例1:输入:head=[1,4,3,2,5,2],x=3输出:[1,2,2,4,3,5]示例2:输入:head=[2,1],x=2输出:[1,2......
  • ECNA 2017 Problem G: A Question of Ingestion DP
    StanFordisatypicalcollegegraduatestudent,meaningthatoneofthemostimportantthingsonhismindiswherehisnextmealwillbe.Fortunehassmiledonhimashe’sbeeninvitedtoamulti-coursebarbecueputonbysomeofthecorporatesponsors......
  • [Leetcode]返回链表开始入环的第一个节点
    力扣链接思路一:快慢指针法一个指针从相遇点走,一个指针从起始点走,会在入口点相遇.最终代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){......
  • LeetCode 40.组合总和II
    1.题目:给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。示例 1:输入:candidates= [10,1,2,7,6,1,5],target= ......
  • Codeforces Round #156 (Div. 2) C. Almost Arithmetical Progression dp
    Genalovessequencesofnumbers.Recently,hehasdiscoveredanewtypeofsequenceswhichhecalledanalmostarithmeticalprogression.Asequenceisanalmostarithmeticalprogression,ifitselementscanberepresentedas:a1 = p,wherepissomeintege......