最大股票收益问题(数组最大差问题)
来源:互联网 发布:日本菜刀 知乎 编辑:程序博客网 时间:2024/05/21 18:23
最大股票收益问题(数组最大差问题)
问题描述
给定一个数组,存储着按照时间排序的股票价格,第
O(n2) 解法
将数组每个元素与其后的所有元素比较,选择增差最大的一对儿。
时间复杂度为:
O(nlogn) 解法
算法思想
采用分而治之的思想,将数组对半分,则最大收益分以下3中情况:
- 在前半段中买并卖
- 在后半段中买并卖
- 在前半段买,在后半段卖
对于第1种和第2种情况,只需要将其看作一个规模减小的新的问题,也就是迭代我们的算法;对于第3种情况,需要在前半段找最小元素
伪代码
void stock(int K[], int startIndex, int endIndex){ int length = endIndex - startIndex; if(1==length) return 0; if(2==length) return K[endIndex]-K[startIndex] > 0 ? K[endIndex]-K[startIndex] : 0; if(length>2){ midIndex = (startIndex+endIndex)/2; min = findMin(K, startIndex, midIndex ); max = findMax(K, midIndex+1, endIndex); mayGet = max(stock(K,startIndex,midIndex), stock(K,startIndex,midIndex), max-min); return mayGet > 0 ? mayGet : 0; }}
复杂度
解得:
O(n) 解法
算法思想
预处理数组,转化为求数组最大子段和问题,然后使用最大子段和的求解算法解决该问题。
步骤:
预处理数组
将数组的每一项减去其紧挨着的前一项,首项设为0;
其含义为:将股价数组,变为股价增幅数组。
如:
K = [3,5,1,2,5,8,9,6]
处理之后变为
K = [0,2,-4,1,3,3,1,-3]
预处理之后,原问题就转化为求数组最大子段和的问题。
例如,在原数组中很显然最大收益为
这其中的道理也很简单,因为预处理之后的数组存储的正是增量,将两个元素之间的所有增量累加,得到的正是两个元素的差值。
预处理算法伪代码:
void preProcess(int K[], int n){ int i; i = n-1; while(i>0){ K[i] = k[i]-k[i-1]; } K[0] = 0;}
求最大子段和
那么最大收益的问题就转化成为了求数组最大子段和的问题,针对最大子段和采用以下算法。
先看伪代码:
void maxSegSum(int K[], int n){ int i; int maxSum=-MAXINT; int tempSum=0; for(i=0; i<n; i++){ tempSum += K[i]; if(tempSum>maxSum) maxSum = tempSum; if(tempSum<0) tempSum=0; } print("max sub-segment sum is %f", maxSum);}
算法描述:
- 从头到尾遍历数组,维持两个全局变量,maxSum记录最优解,tempSum记录从某个位置开始的子段和;
- 每次更新tempSum之后,先和maxSum进行比较,大于maxSum则更新maxSum;然后检查tempSum是否小于0,如果否继续累加,如果是则将tempSum归零;
- 这样遍历一遍数组之后,得到的maxSum就是该数组的最大子段和。
算法综述
- 预处理数组,转化为最大子段和问题
O(n) ; - 使用以上算法求解最大子段和问题
O(n) 。
时间复杂度
即:
- 最大股票收益问题(数组最大差问题)
- 股票最大收益问题及数组最大差值问题
- 买卖股票收益最大问题
- 第四章 最大子数组问题(股票最大收益) C++实现 算法导论
- 最多n次购买时股票最大收益问题
- JAVA股票问题计算你能获得的最大收益
- 最大收益问题
- 股票,最大收益
- 股票收益最大
- 股票最大收益问题3 Best Time to Buy and Sell Stock III
- leetCode:121\122\309 股票买入和卖出获取最大收益问题
- leetcode 股票收益问题
- 股票什么时候买进什么时候卖出收益最大----求最大子数组(算法导论第四章 4.1-3)
- 滴滴校招 餐馆最大收益问题
- 【数字题1】股票的最大收益
- 算法导论之求股票最大收益
- 小米笔试-股票最大收益(动态规划)
- java计算股票一段时间内最大收益
- Java读取txt文件的方法
- scikit-learn 即sklearn的基础学习
- oracle两个date类型相减计算时差
- MySql存在多个root用户.
- Android studio 中查询release和debug版本的SHA1和MD5
- 最大股票收益问题(数组最大差问题)
- HttpClient使用详解
- 自动化运维工具Ansible详细部署
- CI框架(5)-数据读取
- 20170705大数据工作
- php删除字符串所有空格
- Arch安装小记
- ORACLE 02 数据库体系结构
- gnuplot压缩包以及Linux系统中gnuplot安装详解