zoukankan      html  css  js  c++  java
  • leetcode 213 House Robber II

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

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

    示例 1:
    
    输入: [2,3,2]
    输出: 3
    解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
    示例 2:
    
    输入: [1,2,3,1]
    输出: 4
    解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
         偷窃到的最高金额 = 1 + 3 = 4 。
    

    1.先考虑一个问题,就是原条件中第一个与最后一个可以同时取.这个问题就是leetcode---打家劫舍1
    记解决这个问题函数为 solve(int[] nums)
    状态转移方程:
    dp[i]=max(dp[i-2],dp[i-3])
    2.增加了第一个和最后一个不能同时取的限制后,可以发现,
    这时的最大值要么在solve(nums[0:nums.length-1])
    或者在solve(nums[1:nums.length])
    即把原问题划分为2个solve()问题

    var rob = function(nums) {
        const n = nums.length;
        if (n < 2) return n? nums[0]: 0;
        return Math.max(robber(nums, 0, n-2), robber(nums, 1, n-1));
    };
    
    function robber(nums, start, end) {
        let pre = 0, cur = 0;
        for (let i=start;i<=end;i++) {
            let temp = Math.max(pre+nums[i], cur);
            pre = cur;
            cur = temp;
        }
        return cur;
    }
    
  • 相关阅读:
    递归---Day29
    File类---Day28
    线程池---Day26
    微信公众号运营人员必备的软件工具网站合集
    消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ
    itoa函数的递归实现(二级指针实现)
    二叉树——查找两个任意节点的最近祖先
    C#多线程(二)
    C#多线程(一)
    Websocket协议之php实现
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/12194578.html
Copyright © 2011-2022 走看看