• 213. House Robber II


    好像是二刷。

    题干改变的一点就是现在所有房子成环了,首尾相连。

    现在没法用动态规划来dp[n] 来做了,因为第(n-1)个房子和第1个房子是相连的。

    假如我们第一个房子不抢,从n = 1开始,那么剩下的总共n - 1个房子和第一题一样,因为最后一个房子此时就算选了也不和n=0(第一个)重合。

    假如我们第一个房子抢,那就只能抢到第n-2个房子,因为就算第一个抢了,也不会影响第n-1个。

    就这2种情况。

    做的时候用start标记从0还是1开始抢。

    Time: O(n)

    有些Edge cases需要注意,一个是数组运算到的总数是n-2,因为我们现在2种情况要么不抢第一个,要么不抢最后一个,所以会比上轮上一个

    public class Solution {
        public int rob(int[] nums) {
            if (nums.length == 0) return 0;
            if (nums.length == 1) return nums[0];
            if (nums.length == 2) return Math.max(nums[0], nums[1]);
            
            int sol1 = helper(0, nums);
            int sol2 = helper(1, nums);
            return Math.max(sol1, sol2);
        }
        
        public int helper(int start, int[] nums) {
            int[] dp = new int[2];
            dp[0] = nums[start];
            dp[1] = Math.max(nums[start], nums[start + 1]);
            
            for (int i = 2; i < nums.length - 1; i++) {
                dp[i % 2] = Math.max(dp[(i-1)%2], dp[(i-2)%2] + nums[i + start]);
            }
            
            return dp[(nums.length - 2) % 2];
        }
    }
    
  • 相关阅读:
    C/C++网络编程2——socket函数
    C/C++网络编程1——linux下实现
    nginx_2_nginx进程模型
    nginx_1_初始nginx
    C++11并发编程4------线程间共享数据
    C++11并发编程3------线程传参
    C++11并发编程2------线程管理
    C++11并发编程1------并发介绍
    打造自己的开发环境
    gcc/g++/make/cmake/makefile/cmakelists的恩恩怨怨
  • 原文地址:https://www.cnblogs.com/reboot329/p/6127928.html
Copyright © 2020-2023  润新知