贪心 53. 最大子序和 122.买卖股票的最佳时机 II

53. 最大子序和

题目:

给定一个数组,有正有负,找出一个连续子序列的总和最大(子数组最少一个)

暴力思路:

双层for循环,记录每一次可能的子序列的总和,初始为整数最小值,当遇见比记录的总和值大的就更新记录,这样循环走完,自然得到数组连续子序列的最大总和。

贪心思路:

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。

当子数组总和(连续和)为负数的时候,进入到下一个循环,在暴力思路的基础上,比如-1,2,循环到-1的时候,总和计算为-1,看看比不比已经记录的总和大?然后跳过这里,从2继续计算总和,总和为2,为正,继续。

class Solution {
public:
    int maxSubArray(vector& 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天,所以利润从第二天开始看)

贪心 53. 最大子序和 122.买卖股票的最佳时机 II_第1张图片

贪心思路就是,局部最优:收集每天的正利润 推出 全局最优:求得最大利润

class Solution {
public:
    int maxProfit(vector& prices) {
        int result = 0;
        for (int i = 1; i < prices.size(); i++) {
            result += max(prices[i] - prices[i - 1], 0);
        }
        return result;
    }
};

你可能感兴趣的:(算法)