53. 最大子序和
题目:
给定一个数组,有正有负,找出一个连续子序列的总和最大(子数组最少一个)
暴力思路:
双层for循环,记录每一次可能的子序列的总和,初始为整数最小值,当遇见比记录的总和值大的就更新记录,这样循环走完,自然得到数组连续子序列的最大总和。
贪心思路:
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。
当子数组总和(连续和)为负数的时候,进入到下一个循环,在暴力思路的基础上,比如-1,2,循环到-1的时候,总和计算为-1,看看比不比已经记录的总和大?然后跳过这里,从2继续计算总和,总和为2,为正,继续。
。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT32_MIN;
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums[i];
if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置)
result = count;
}
if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
}
return result;
}
};
122.买卖股票的最佳时机 II
题目:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润
可以多次交易,但需要遵守(购买一次股票后必须卖掉该股票才能再次购买)的规则
示例 1:
- 输入: [7,1,5,3,6,4]
- 输出: 7
- 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
贪心思路:
一般来说,就是不断挑低的买入,挑高的卖出。换成贪心思路,是由最终利润可分解推导出来的,比如下图,最终利润12是5-1,10-5,6-3相加的来的,收集每一天的正利润,把正利润相加就是最优交易操作的来最大利润(第一天没有利润,因为没有第0天,所以利润从第二天开始看)
贪心思路就是,局部最优:收集每天的正利润 推出 全局最优:求得最大利润。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); i++) {
result += max(prices[i] - prices[i - 1], 0);
}
return result;
}
};