zoukankan      html  css  js  c++  java
  • 198. House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

    Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

    Example 1:

    Input: nums = [1,2,3,1]
    Output: 4
    Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
                 Total amount you can rob = 1 + 3 = 4.
    

    Example 2:

    Input: nums = [2,7,9,3,1]
    Output: 12
    Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
                 Total amount you can rob = 2 + 9 + 1 = 12.
    

    Constraints:

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

    DP
    base case: f(0) = array[0], f(1) = max(array[0], array[1])
    induction rule: f(i) = max(f(i-2) + array[i], f(i-1))
    (1) f(i) = f(i-2) + array[i] -> rob array[i]
    (2) f(i) = f(i-1) -> don't rob array[i]
    time = O(n), space = O(1)

    M1: naive, time = O(n), space = O(n)

    class Solution {
        public int rob(int[] nums) {
            if(nums == null || nums.length == 0) {
                return 0;
            }
            if(nums.length == 1) {
                return nums[0];
            }
            int[] dp = new int[nums.length];
            dp[0] = nums[0];
            dp[1] = Math.max(nums[0], nums[1]);
            for(int i = 2; i < nums.length; i++) {
                dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
            }
            return dp[nums.length - 1];
        }
    }

    M2: space optimization, time = O(n), space = O(1)

    class Solution {
        public int rob(int[] nums) {
            if(nums == null || nums.length == 0) {
                return 0;
            }
            if(nums.length == 1) {
                return nums[0];
            }
            int[] dp = new int[3];
            dp[0] = nums[0];
            dp[1] = Math.max(nums[0], nums[1]);
            for(int i = 2; i < nums.length; i++) {
                dp[i % 3] = Math.max(dp[(i - 2) % 3] + nums[i], dp[(i - 1) % 3]);
            }
            return dp[(nums.length - 1) % 3];
        }
    }

    二刷:

    class Solution {
        public int rob(int[] nums) {
            if(nums == null || nums.length == 0) {
                return 0;
            }
            if(nums.length == 1) {
                return nums[0];
            }
            if(nums.length == 2) {
                return Math.max(nums[0], nums[1]);
            }
            
            int m0 = nums[0], m1 = Math.max(nums[0], nums[1]);
            int m2 = Math.max(m0 + nums[2], m1);
            for(int i = 2; i < nums.length; i++) {
                m2 = Math.max(m0 + nums[i], m1);
                m0 = m1;
                m1 = m2;
            }
            return m2;
        }
    }
  • 相关阅读:
    YOLO V2 代码分析
    HDU 1728 逃离迷宫【BFS】
    POJ 2987 Firing【最大权闭合图-最小割】
    POJ 2914 Minimum Cut【最小割 Stoer-Wangner】
    模拟C#的事件处理和属性语法糖
    c版基于链表的插入排序(改进版)
    一句话概述代码的用途
    用python实现的抓取腾讯视频所有电影的爬虫
    jquery 实现智能炫酷的翻页相册效果
    KISSY(JS)炫动导航,缓动应用实例(^_^)
  • 原文地址:https://www.cnblogs.com/fatttcat/p/13666863.html
Copyright © 2011-2022 走看看