问:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。
例:
输入:nums = [2,3,2]
输出:3
原题链接:https://leetcode.cn/problems/house-robber-ii/
答:
class Solution {
public int rob(int[] nums) {
int len = nums.length;
if(len == 1)
return nums[len-1];//如果只有一家的话 就偷num[0]
if(len == 2)
return Math.max(nums[0],nums[1]);//如果有两家的话就偷nums[0],nums[1]中钱最多的一家
return Math.max(rob1(nums,0,len-2),rob1(nums,1,len-1));//因为不能偷相邻的两家,所以第一个和最后一个不能同时被偷
}
public int rob1(int[] nums,int start,int end)
{
int first = nums[start];
int second = Math.max(nums[start],nums[start+1]);
for(int i = start + 2;i <= end;i++)//从第三家开始
{
int t = second;
second = Math.max(first + nums[i],second);
first = t;
}
return second;
}
}
解析在代码注释里了,有什么不明白的可以评论交流学习~