当前位置: 首页 > news >正文

【leetcode hot 100 198】打家劫舍

解法一:(动态规划)倒叙 -> 难

import java.util.*;

/**
 * @author longyy
 * @version 1.0
 */
class Solution79 {
    public int rob(int[] nums) {
        int n = nums.length;
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        if (n == 2) return Math.max(nums[0],nums[1]);
        int max = 0;
        int[] max_money = new int[n];
        max_money[n-1] = nums[n-1];
        max_money[n-2] = nums[n-2];
        for (int i = n-3; i >= 0; i--) {
            max_money[i] = Math.max(max_money[i+2]+nums[i], max_money[i+1]);
            if (i+3<n){
                max_money[i] = Math.max(max_money[i+3]+nums[i], max_money[i]);
            }
            max = Math.max(max, max_money[i]);
        }
        return max;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }
        Solution79 sol = new Solution79();
        System.out.println(sol.rob(nums));
    }
}

解法二:(动态规划)正序 ①定义:dp[i]表示偷到下标为i的家能偷到的最高金额,dp[n] ②初始状态:dp[0]=nums[0],dp[1]=max(nums[0],nums[1]) ③状态转移方程:dp[i] = max(dp[i-1],dp[i-2]+nums[i]),其中dp[i-1]表示不偷下标为i的家;dp[i-2]+nums[i]表示偷下标为i的家

class Solution {
    public int rob(int[] nums) {
    	// 定义:dp[i]表示偷到下标为i的家能偷到的最高金额,dp[n]
        // 初始状态:dp[0]=nums[0],dp[1]=max(nums[0],nums[1])
        // 状态转移方程:dp[i] = max(dp[i-1],dp[i-2]+nums[i]),其中dp[i-1]表示不偷下标为i的家;dp[i-2]+nums[i]表示偷下标为i的家
        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];
    }
}

注意:

  • dp[i]表示到i(第i+1)家时,能够偷窃到的最高金额
  • i(第i+1家)时,可偷(dp[i - 2] + nums[i]或者不偷dp[i - 1]
  • dp初始化未dp[n],初始状态为dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]);,返回值为dp[length - 1]
http://www.dtcms.com/a/122929.html

相关文章:

  • 【力扣hot100题】(074)前 K 个高频元素
  • Nginx之https重定向为http
  • 【DvAdmin】接口返回 emoji 显示 ?解决方法
  • ArkTS语言入门之接口、泛型、空安全、特殊运算符等
  • vue3的router.ts中,在children和不在的区别
  • Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南
  • MySQL中FIND_IN_SET函数与INSTR函数用法解析
  • 鸿蒙小案例---心情日记
  • VSCode解决中文乱码方法
  • 【c语言】深度剖析数据在内存中的存储
  • SpringAI调用硅基流动免费模型
  • 应急响应-进程排查
  • Ceph异地数据同步之-Cephfs异地同步复制
  • 【图书管理系统】全栈开发图书管理系统获取图书列表接口(后端:计算图书页数、查询当前页展示的书籍)
  • 前端三件套—HTML入门
  • 数论学习笔记:素数筛
  • 数据库事务隔离级别
  • 前端性能指标详解
  • 【Leetcode-Hot100】盛最多水的容器
  • React 响应事件
  • 如何实现文本回复Ai ChatGPT DeepSeek 式文字渐显效果?前端技术详解(附完整代码)
  • 【MySQL】安装
  • CD25.【C++ Dev】类和对象(16) static成员(上)
  • redis(2)-mysql-锁
  • 经典算法 最近点对问题
  • 猜猜乐游戏(python)
  • Trae AI 保姆级教程:从安装到调试全流程指南
  • FastAdmin和thinkPHP学习文档
  • 国标GB28181协议EasyCVR视频融合平台:5G时代远程监控赋能通信基站安全管理
  • 文字识别 (OCR) 工具