一【题目类别】
二【题目难度】
三【题目编号】
四【题目描述】
- 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
- 给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
五【题目示例】
-
示例 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:
六【解题思路】
- 利用动态规划的思想
- 和【LeetCode每日一题】——面试题17.16.按摩师的思想类似
- 只不过这个题目类似一个循环队列,也就是说第一个和最后一个不能同时出现,那么就分两种情况
- 第一种情况:从0~n-1
- 第二种情况:从1~n
- 找出动态转移方程:max(dp[i - 2] + nums[i], dp[i - 1])
- 最后返回两种情况中最大的即可
七【题目提示】
- 1 <= nums.length <= 100
- 0 <= nums[i] <= 1000
八【时间频度】
- 时间复杂度:
O
(
n
)
O(n)
O(n),其中
n
n
n 是数组大小
- 空间复杂度:
O
(
n
)
O(n)
O(n),其中
n
n
n 是数组大小
九【代码实现】
- Java语言版
package DynamicProgramming;
public class p213_RobberyII {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 1};
int res = rob(nums);
System.out.println("res = " + res);
}
public static int rob(int[] nums) {
int len = nums.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return nums[0];
}
if (len == 2) {
return Math.max(nums[0], nums[1]);
}
return Math.max(getRes(nums, 0, len - 2), getRes(nums, 1, len - 1));
}
public static int getRes(int[] nums, int begin, int end) {
int[] dp = new int[nums.length];
dp[begin] = nums[begin];
dp[begin + 1] = Math.max(nums[begin], nums[begin + 1]);
for (int i = begin + 2; i <= end; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[end];
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
#define max(a,b) ((a) > (b) ? (a) : (b))
int getRes(int* nums, int numsSize, int begin, int end)
{
int* dp = (int*)malloc(sizeof(int) * numsSize);
dp[begin] = nums[begin];
dp[begin + 1] = max(nums[begin], nums[begin + 1]);
for (int i = begin + 2; i <= end; i++)
{
dp[i] = max((dp[i - 2] + nums[i]), dp[i - 1]);
}
return dp[end];
}
int rob_p213_RobberyII(int* nums, int numsSize)
{
if (numsSize == 0)
{
return 0;
}
if (numsSize == 1)
{
return nums[0];
}
if (numsSize == 2)
{
return max(nums[0], nums[1]);
}
return max(getRes(nums, numsSize, 0, numsSize - 2), getRes(nums, numsSize, 1, numsSize - 1));
}
十【提交结果】
-
Java语言版 -
C语言版
|