1.53. 最大子数组和 - 力扣(LeetCode)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxRes = nums[0];
for(int x : nums)
{
pre = max(pre + x, x);
maxRes = max(maxRes, pre);
}
return maxRes;
}
};
其实弄懂也就挺简单了。
pre:存储遍历到当前位置为止最大的子数组和,包括当前元素。
maxRes:存储到遍历过程中最大的子数组和
对于每个遍历到的当前元素,如果之前的数组和加上它要大一点那就更新加上,如果当前加上当前元素,答案数组还减小了,那就从当前元素开始,要满足子数组的定义啊。
不断把当前的答案与之前的pre数组更新。
注意答案要初始化为数组的第一个元素,不能初始化为0;
2.198. 打家劫舍 - 力扣(LeetCode)
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(!n) return 0;
vector<int> dp(n+1, 0);
dp[0] = 0;
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];
}
};
偷n所房子可以根据偷1所,偷2所,偷3所......偷k所求得(当k=n的时候就可以求得答案)
对于偷k所房子,有两种方案:
方案1:偷前k-1所,第k所不偷
方案2:偷前k-2所,第k-1所不偷,第k所偷
注意数组下标和房间号有一个右移的偏移关系。
当只有0间房子的时候,dp[0] 为 0,只有一中选择,一间都偷不了
当只有1间房子的时候,dp[1] 为 1,只有一种选择偷这一间