Leetcode121.+Leetcode53. Kadane算法解决最大子数组问题

来源:互联网 发布:linux arp命令详解 编辑:程序博客网 时间:2024/06/14 10:56

Leetcode121. Best Time to Buy and Sell Stock

题目

Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

Example 1:
Input: [7, 1, 5, 3, 6, 4]
Output: 5
max_difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)

Example 2:
Input: [7, 6, 4, 3, 1]
Output: 0
In this case, no transaction is done, i.e. max profit = 0.

解题分析

这道题粗略一看不是很难,很普通的做法就是两层循环,时间复杂度为O(n^2),那有没有什么更好的做法呢?
今天在这里我推荐一种经典的解决最大子数组的Kadene算法。Kadane算法扫描一次整个数列的所有数值,在每一个扫描点计算以该点数值为结束点的子数列的最大和(正数和)。该子数列由两部分组成:以前一个位置为结束点的最大子数列、该位置的数值。
所以按照Kadene算法的思想,用变量maxCur来记录包含当前元素的最大值,用变量maxSoFar来记录到目前为止所找到的最大值。每遍历一个元素,就将该元素与上一个元素的差值加到maxCur上,如果maxCur大于maxSoFar,就更新maxSoFar的值,这样在遍历完一次数组后,所获得的maxSoFar就是最终的结果,时间复杂度为O(n)。是不是很简单呢?

源代码

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

Leetcode53. Maximum Subarray

题目

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

解题分析

这道题与上面那道题非常类似,都是求最大子数组的问题。类似地,我们用maxCur和maxSoFar两个变量来分别记录包含当前节点的和的最大值以及到目前为止所找到的和的最大值。在遍历数组求和的时候,如果之前遍历的元素的和小于当前元素,就将maxCur更新为当前元素的值;如果maxCur大于maxSoFar,就更新maxSoFar的值,以确保maxSoFar记录的是当前找到的数组的最大和。同样,在遍历完一次数组后,结果就自然出来了,下面简要附上源代码~

源代码

class Solution {public:    int maxSubArray(vector<int>& nums) {        int maxCur = nums[0], maxSoFar = nums[0];        for (int i = 1; i < nums.size(); i++) {            maxCur = max(nums[i], maxCur += nums[i]);            maxSoFar = max(maxCur, maxSoFar);        }        return maxSoFar;    }};

以上是我对这两道最大子数组问题的一些想法,有问题还请在评论区讨论留言~

阅读全文
0 0
原创粉丝点击