如何做二手车网站,济南市住建局官网,杭州网络公司网站建设,企业管理咨询论文231.打家劫舍Ⅱ
你是一个专业的小偷#xff0c;计划偷窃沿街的房屋#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 #xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时#xff0c;相邻的房屋装有相互连通的防盗系统#xff0c;如果两间…231.打家劫舍Ⅱ
你是一个专业的小偷计划偷窃沿街的房屋每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 这意味着第一个房屋和最后一个房屋是紧挨着的。同时相邻的房屋装有相互连通的防盗系统如果两间相邻的房屋在同一晚上被小偷闯入系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组计算你 在不触动警报装置的情况下 今晚能够偷窃到的最高金额。
示例 1
输入nums [2,3,2]
输出3
解释你不能先偷窃 1 号房屋金额 2然后偷窃 3 号房屋金额 2, 因为他们是相邻的。示例 2
输入nums [1,2,3,1]
输出4
解释你可以先偷窃 1 号房屋金额 1然后偷窃 3 号房屋金额 3。偷窃到的最高金额 1 3 4 。示例 3
输入nums [1,2,3]
输出3提示
1 nums.length 1000 nums[i] 1000
题解
本题在198.打家劫舍的基础上进行了变化将首尾两个元素连成了环成环之后思考的难度提高了很多因为如过要使用动态规划的话不知道从哪个位置开始。
因此第一步是将本题进行转换。首尾成环相较于没有成环其实是多了三种情况。
情况一我不考虑首尾元素只考虑中间部分情况二我不考虑尾元素只考虑首元素和中间部分情况三我不考虑首元素只考虑中间部分和尾元素
在这三种情况中其实情况一的值一定是小于等于情况二和情况三的。因为情况二和三考虑的范围包括住了情况一在一个更大的范围内求解最大值一定是大于等于的关系。
因此可以将情况二和情况三分别拆分成两个数组送入到198.打家劫舍的算法中再取最大值即可.
package com.offer;/*** author bwzfy* create 2024/4/16**/
public class _213打家劫舍Ⅱ {public static void main(String[] args) {System.out.println(rob(new int[]{2, 3, 2}));}public static int rob(int[] nums) {if (nums.length 1) {return nums[0];}// 三种选择// 两头都不考虑(这种情况其实包含在了下面两种情况中因此只要考虑下面两种情况下的最大值就可以了)// 只考虑头// 只考虑尾return Math.max(rob(nums, 0, nums.length - 2), rob(nums, 1, nums.length - 1));}private static int rob(int[] nums, int left, int right) {if (right left) {// 如果只有一个元素直接返回return nums[left];}int[] dp new int[right - left 1];// 只考虑一户人家的时候最多能拿多少钱dp[0] nums[left];// 只考虑两户人家的时候最多能拿多少钱dp[1] Math.max(nums[left], nums[left 1]);for (int i 2; i right - left; i) {dp[i] Math.max(dp[i - 1], nums[left i] dp[i - 2]);}return dp[right - left];}
}