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; }};
以上是我对这两道最大子数组问题的一些想法,有问题还请在评论区讨论留言~
- Leetcode121.+Leetcode53. Kadane算法解决最大子数组问题
- Kadane算法(值最大的连续子数组)
- 一个矩阵的所有子矩阵最大和问题、Kadane算法
- 从一道easy leetcode问题,谈谈最大子列和的Kadane算法
- 清晰解题: 寻找最大子数列-Kadane算法
- 求最大连续子序列的和,两种解法:动态规划 & Kadane算法
- 线性时间解决最大子数组问题
- 分治法解决最大子数组问题
- 算法学习笔记----最大子数组问题
- 算法导论之最大子数组问题
- 【算法导论】最大子数组问题
- 【算法设计-分治】最大子数组问题
- 算法之最大子数组问题
- 算法导论--最大子数组问题
- 算法导论—最大子数组问题
- 分治算法-最大子数组问题
- 算法(一)最大子数组问题
- 最大子数组问题的分治算法
- Spring mvc 注解使用
- TensorFlow学习(一)MNIST数据库例程执行
- MIT18.06线性代数课程笔记5:矩阵转置,vector space以及subspace
- 树形结构的查找(二叉排序树-创建、查找、插入、删除)
- python 利用random生成验证码与MD5码加密过程
- Leetcode121.+Leetcode53. Kadane算法解决最大子数组问题
- java工程结构管理
- Python 线程,独立的线程空间(threading.local())
- Android移动开发-使用HttpClient访问被保护资源的实现
- java设计模式之单例模式
- 欢迎使用CSDN-markdown编辑器
- 嵌入式开发(ARM9)学习笔记(一)-嵌入式系统介绍
- libcurl库源码编译,安装c++
- hdu2017青岛网络赛Pythagoras(Tree of primitive Pythagorean triples)