本文共 1055 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要找到在不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。这个问题可以通过动态规划来解决。
我们可以通过动态规划的方法来解决这个问题。具体步骤如下:
问题分析:每间相邻的房屋不能同时被偷窃。因此,我们需要找到一个可行的解,使得偷窃的顺序不会触发警报,同时总金额最大化。
状态定义:用 dp[i]
表示前 i
个房屋能偷窃到的最大金额。
边界条件:
状态转移:对于第 i
个房屋(i > 2
),我们有两种选择:
i
个房屋,则前 i-1
个房屋中不能偷窃第 i-1
个房屋,因此最大金额为 dp[i-2] + nums[i]
。i
个房屋,最大金额为 dp[i-1]
。递推关系:dp[i] = max(dp[i-1], dp[i-2] + nums[i])
。
class Solution { public int rob(int[] nums) { if (nums.length == 0) { return 0; } if (nums.length == 1) { return nums[0]; } int n = nums.length; int[] dp = new int[n]; dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]); for (int i = 2; i < n; i++) { dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]); } return dp[n - 1]; }}
dp[0]
初始化为第一个房屋的金额,dp[1]
初始化为前两个房屋中金额较大的那个。dp[n-1]
即为前 n
个房屋能偷窃到的最大金额。这种方法通过动态规划有效地解决了问题,时间复杂度为 O(n),空间复杂度为 O(n)。
转载地址:http://jmgyk.baihongyu.com/