zoukankan      html  css  js  c++  java
  • Medium | LeetCode 198. 打家劫舍 | 动态规划

    198. 打家劫舍

    难度中等1293收藏分享切换为英文接收动态反馈

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

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

    示例 1:

    输入:[1,2,3,1]
    输出:4
    解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
         偷窃到的最高金额 = 1 + 3 = 4 。
    

    示例 2:

    输入:[2,7,9,3,1]
    输出:12
    解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
         偷窃到的最高金额 = 2 + 9 + 1 = 12 。
    

    提示:

    • 0 <= nums.length <= 100
    • 0 <= nums[i] <= 400

    解题思路

    方法一: 动态规划

    动态规划的思路很简单:偷窃第 k 间房屋,那么就不能偷窃第 k-1间房屋,偷窃总金额为前 k-2间房屋的最高总金额与第 k间房屋的金额之和。

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

    [d p[i]=max (d p[i-2]+operatorname{nums}[i], d p[i-1]) ]

    public int rob(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int length = nums.length;
        if (length == 1) {
            // 只有一间房的情况
            return nums[0];
        }
        // first代表K-2, second代表K-1
        int first = nums[0], second = Math.max(nums[0], nums[1]);
        for (int i = 2; i < length; i++) {
            int temp = second;
            // 递推关系
            second = Math.max(first + nums[i], second);
            // 迭代滚动
            first = temp;
        }
        return second;
    }
    
  • 相关阅读:
    Kubernetes Admission Controller解析
    容器化Node Exporter对主机磁盘使用率的监控问题
    Prometheus监控指标的label注入方法
    Prometheus告警模型分析
    Kubernetes Controller执行框架解析
    深入理解Istio核心组件之Pilot
    Prometheus存储模型分析
    如何利用Prometheus监控你的应用
    Prometheus在Kubernetes下的服务发现机制
    JSON字符串和js对象转换
  • 原文地址:https://www.cnblogs.com/chenrj97/p/14455856.html
Copyright © 2011-2022 走看看