题目:198. 打家劫舍
方法一:动态规划dp,时间复杂度0(n)。
C++版本:
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
//状态f[i][0]:不选第i-1位元素可以拿的最大值(i:1~n+1)
//状态f[i][1]:选第i-1位元素可以拿的最大值(i:1~n+1)
vector<vector<int>> f(n+1,vector<int>(2,0));
f[1][1]=nums[0];
int mx=f[1][1];
for(int i=1;i<n;i++){
f[i+1][0]=max(f[i][0],f[i][1]);
f[i+1][1]=f[i][0]+nums[i];
mx=max(f[i+1][0],mx);
mx=max(f[i+1][1],mx);
}
return mx;
}
};
方法二:动态规划dp,时间复杂度0(n)。
C++版本:
class Solution {
public:
int rob(vector<int>& nums) {
int n=nums.size();
//状态f[i]:在0~i-1的元素中所能取到的最大值
vector<int> f(n+1,0);
f[1]=nums[0];
int mx=f[1];
for(int i=1;i<n;i++){
f[i+1]=max(f[i],f[i-1]+nums[i]);
mx=max(f[i+1],mx);
}
return mx;
}
};
JAVA版本:
class Solution {
public int rob(int[] nums) {
int n=nums.length;
int[] f=new int[n+1];
f[1]=nums[0];
int mx=f[1];
for(int i=1;i<n;i++){
f[i+1]=Math.max(f[i],f[i-1]+nums[i]);
mx=Math.max(f[i+1],mx);
}
return mx;
}
}
Go版本:
func rob(nums []int) int {
n:=len(nums)
f:=make([]int,n+1)
f[0]=0
f[1]=nums[0]
mx :=f[1]
for i:=1;i<n;i++ {
f[i+1]=max(f[i],f[i-1]+nums[i])
mx=max(mx,f[i+1])
}
return mx
}