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

    原题链接:https://leetcode.com/problems/house-robber/description/
    这道题目有意思哦:

    /**
     * Created by clearbug on 2018/2/26.
     */
    public class Solution {
    
        public static void main(String[] args) {
            Solution s = new Solution();
            int[] nums = new int[]{49, 38, 65, 97, 76, 13, 27, 49};
            System.out.println(s.rob2(nums));
        }
    
        /**
         * 方法三:动态规划,迭代版本
         *
         * Submission Detail: 100.00%
         * Runtime: 0 ms
         * 
         * @param nums
         * @return
         */
        public int rob(int[] nums) {
            if (nums == null || nums.length < 1) {
                return 0;
            }
    
            int curr = 0, prev = 0, prevPrev = 0;
            for (int i = 0; i < nums.length; i++) {
                curr = Math.max(prev, prevPrev + nums[i]);
                prevPrev = prev;
                prev = curr;
            }
            return curr;
        }
    
        /**
         * 方法二:动态规划,迭代版本,以空间换时间
         *
         * Submission Detail: 25.35%
         * Runtime: 1 ms
         *
         * 从上面的运行结果来看,跟最优答案还有很大差距。。。然后我就去看了下最优答案:其实思路差不多,只不过用两个变量来代替数组,见方法三
         *
         * @param nums
         * @return
         */
        public int rob2(int[] nums) {
            if (nums == null || nums.length < 1) {
                return 0;
            }
    
            int[] res = new int[nums.length];
            for (int i = 0; i < nums.length; i++) {
                if (i == 0) {
                    res[i] = nums[0];
                } else if (i == 1) {
                    res[i] = Math.max(nums[0], nums[1]);
                } else {
                    res[i] = Math.max(res[i - 1], res[i - 2] + nums[i]);
                }
            }
            return res[nums.length - 1];
        }
    
    
        /**
         * 方法一:动态规划,递归实现版本
         *
         * Submission Result: Time Limit Exceeded
         *
         * @param nums
         * @return
         */
        public int rob1(int[] nums) {
            if (nums == null || nums.length < 1) {
                return 0;
            }
            return robHelper(nums, nums.length);
        }
    
        private int robHelper(int[] nums, int n) {
            if (n == 1) {
                return nums[0];
            }
            if (n == 2) {
                return Math.max(nums[0], nums[1]);
            }
    
            return Math.max(robHelper(nums, n - 1), robHelper(nums, n - 2) + nums[n - 1]);
        }
    }
    

    参考

    https://blog.csdn.net/pistolove/article/details/47680663

  • 相关阅读:
    2021.3.3
    2021.3.2
    2021.3.1
    2021.2.28(每周总结)
    2021.2.27
    2021.2.26
    2021.2.25
    2021.2.23
    Redis系统学习之五大基本数据类型(List(列表))
    Redis系统学习之五大基本数据类型(String(字符串))
  • 原文地址:https://www.cnblogs.com/optor/p/8690999.html
Copyright © 2011-2022 走看看