题意:
给定一个整数数组nums,数组中的元素表示每个房间存有的现金数额,你不能偷相邻的两家,请你计算在不被发现的前提下最多的偷窃金额。
方法一:
动态规划
思路:dp[ i ]表示前i个房间最多的偷窃金额。![]()
class Solution {
public:
int dp[200005]={0};//dp[i]表示前i个房间最多的偷窃金额
int rob(vector<int>& nums) {
int n=nums.size();
dp[1]=nums[0];//初始化
for(int i=2;i<=n;i++){//循环
dp[i]=max(dp[i-1],dp[i-2]+nums[i-1]);//状态转移方程
}
return dp[n];
}
};
时间复杂度:
空间复杂度:![]()
方法二:
滚动数组优化
思路:
根据状态转移方程,可知当前项只与前两项相关,因此可以不用一维数组,改用几个变量实现。(滚动数组)
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
int t1=nums[0],t2=max(nums[0],nums[1]);//初始化
for(int i=2;i<n;i++){//循环
int t=max(t2,t1+nums[i]);//状态转移方程
t1=t2;//滚动数组
t2=t;
}
return t2;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号