2023每日刷题(五十二)
Leetcode—198.打家劫舍
算法思想
具体思路
首先,我们从上面的题目描述中抽象出题意。
● 从一个非负整数数组中找到一个子序列,并且该子序列的和最大
● 子序列中每个数的位置不能够相邻。举例来讲,如果子序列中包含位置为1的数,就不能包括位置为2的数。
实现代码
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 1) {
return nums[0];
}
if(n == 2) {
return max(nums[0], nums[1]);
}
int f[n];
memset(f, 0, sizeof(f));
f[0] = nums[0];
f[1] = max(nums[1], nums[0]);
for(int i = 2; i < n; i++) {
f[i] = max(f[i - 1], f[i - 2] + nums[i]);
}
return f[n - 1];
}
};
运行结果
空间优化实现代码
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 1) {
return nums[0];
}
if(n == 2) {
return max(nums[0], nums[1]);
}
int f0 = 0, f1 = 0, new_f = 0;
f0 = nums[0];
f1 = max(nums[1], nums[0]);
for(int i = 2; i < n; i++) {
new_f = max(f1, f0 + nums[i]);
f0 = f1;
f1 = new_f;
}
return new_f;
}
};
运行结果
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!