• 第198题:打家劫舍


    一. 问题描述

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

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

    示例 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 。

    二. 解题思路

    本题思路:采用动态规划的方法进行求解,找到动态转移函数f(n)=max(f(n-1)+m(n),f(n-2)+m(n)),其中f(n)代表前n个房屋所偷盗最大值,而m(n)代表第n个房屋的金额。

    步骤一:根据状态转移函数times,创建一个数组存储每一次可能的最大值。

    步骤二:遍历数组,通过动态转移函数,将每次的最大值计算出来,并将最终最大值存储到maxvalue中,最后输出maxvalue。

    三. 执行结果

    执行用时 :0 ms, 在所有 java 提交中击败了100.00%的用户

    内存消耗 :34.3 MB, 在所有 java 提交中击败了85.14%的用户

    四. Java代码

    class Solution {
        public int rob(int[] nums) {
            if(nums.length<=0||nums==null) {
                return 0;
            }
            int []time=new int[nums.length];
            int maxvalue=0;
            for(int i=0;i<nums.length;i++) {
                if(i-2<0||i-3<0) {
                    if(i-2<0) {
                        time[i]=nums[i];
                    }else {
                        time[i]=time[i-2]+nums[i];
                    }
                    if(time[i]>maxvalue) {
                        maxvalue=time[i];
                    }
                  
                }else {
                    time[i]=Math.max(time[i-2]+nums[i], time[i-3]+nums[i]);
                    if(time[i]>maxvalue) {
                        maxvalue=time[i];
                    }
                    
                }
                
            }
            return maxvalue;
        }
    }
  • 相关阅读:
    第10组 Alpha冲刺(4/4)
    python2中的新式类与经典类区别
    http请求Content-Type有几种
    2020 年软件设计师考试大纲
    11-Elasticsearch之-组合查询
    16-扩展阅读-摘录
    各种排序算法
    Vmware虚拟机三种网络模式详解(转载)
    无法访问 CentOS7服务器上应用监听的端口
    VsCode 常用插件清单
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/12066543.html
Copyright © 2020-2023  润新知