海南企业建站,免费制作视频相册,公司网站开发工具,网站公司一站式服务题意理解#xff1a; 你是一个专业的小偷#xff0c;计划偷窃沿街的房屋#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 #xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时#xff0c;相邻的房屋装有相互连通的防盗系统#xff0c;如果… 题意理解 你是一个专业的小偷计划偷窃沿街的房屋每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 这意味着第一个房屋和最后一个房屋是紧挨着的。同时相邻的房屋装有相互连通的防盗系统如果两间相邻的房屋在同一晚上被小偷闯入系统会自动报警 。 给定一个代表每个房屋存放金额的非负整数数组计算你 在不触动警报装置的情况下 今晚能够偷窃到的最高金额。 假设从A点开始偷若小偷偷了A,则根据规则不能偷E 若小偷没有投A,则可以偷E A B C D E的循环将其进行分情况讨论: (1)不考虑首位 BCD (2)不考虑尾 ABCD (3)不考虑头 BCDE 可以发现题目的完整情况其实时23的综合第一种情况在23里面都包含了。 所以我们分两种情况考虑初次之外该问题还是一个简单的打家劫舍问题。 解题思路 1.解题 public int rob(int[] nums) {if (nums.length0) return 0;if(nums.length1) return nums[0];if(nums.length2) return Math.max(nums[0],nums[1]);int[] dp_startnew int[nums.length-1];int[] dp_endnew int[nums.length-1];Arrays.fill(dp_start,0);Arrays.fill(dp_end,0);dp_start[0]nums[0];dp_start[1]Math.max(nums[0],nums[1]);dp_end[0]nums[1];dp_end[1]Math.max(nums[1],nums[2]);for(int i2;inums.length-1;i){dp_start[i]Math.max(dp_start[i-1],dp_start[i-2]nums[i]);dp_end[i]Math.max(dp_end[i-1],dp_end[i-2]nums[i1]);}return Math.max(dp_start[nums.length-2],dp_end[nums.length-2]);}
2.分析 时间复杂度O(n) 空间复杂度O(2n)