如何买卖股票以获得最大收益 java算法
2013-01-25 15:34
274 查看
已知一段时间内股价有涨跌,例如 {3,6,1,4,7,3,8,8,3,5}.求最大获利是多少。不能买空卖空。
例如,上例应该是第3天买,第7天卖获利最大,获利是7元。
我没有想出什么好办法,下例就是循环的比差值。但是实际上有O(n)的解法。
下面是O(n)的解法:
env[0] 代表股票阶段性的低点,env[1]代股票阶段性的高点。用maxD记录低点和高点的最大差值。当低点和高点的值发生变化时,计算一下差值并和之前的maxD比较一下,如果更高则更新一下maxD。
上面代码中最巧妙的地方是当当天的股票值小于前期的低点时,才会去更新阶段最低股票值。也就是说,股票没有跌破前面几天的最低点的小波动,仍然被算作一个上升期。
例如,上例应该是第3天买,第7天卖获利最大,获利是7元。
我没有想出什么好办法,下例就是循环的比差值。但是实际上有O(n)的解法。
public class App { public static void main(String[] args) { int[] a={3,6,1,4,7,3,8,8,3,5}; int d=0; for(int i=1;i<a.length;i++){ int[] x = Arrays.copyOfRange(a,0,i); int[] y = Arrays.copyOfRange(a,i,a.length); if(d < highest(y) - lowest(x) ){ d = highest(y) - lowest(x); } } System.out.print(d); } public static int lowest(int[] x){ int i=x[0]; for(int j=0;j<x.length-1;j++){ if(x[j] > x[j+1]){ i = x[j+1]; } } return i; } public static int highest(int[] x){ int i=x[0]; for(int j=0;j<x.length-1;j++){ if(x[j] < x[j+1]){ i = x[j+1]; } } return i; } }
下面是O(n)的解法:
public class App { public static void main(String[] args) { int[] a={ 4,1,3,6,6,7,8,9,2,11}; int[] env={0,0}; env[0] = a[0]; env[1] = a[0]; int maxD=0; for(int i=1; i<a.length;i++){ if(a[i] > env[1]){ env[1] = a[i]; if(maxD < env[1] - env[0]){ maxD = env[1] - env[0]; } }else if(a[i] < env[0]){ env[0] = a[i]; env[1] = a[i]; } } System.out.print(maxD); } }
env[0] 代表股票阶段性的低点,env[1]代股票阶段性的高点。用maxD记录低点和高点的最大差值。当低点和高点的值发生变化时,计算一下差值并和之前的maxD比较一下,如果更高则更新一下maxD。
上面代码中最巧妙的地方是当当天的股票值小于前期的低点时,才会去更新阶段最低股票值。也就是说,股票没有跌破前面几天的最低点的小波动,仍然被算作一个上升期。
相关文章推荐
- JAVA股票问题计算你能获得的最大收益
- Leetcode 188 Best Time to Buy and Sell Stock IV 至多k次买卖股票最大收益
- 买卖股票收益最大问题
- [leetcode 121] Best Time to Buy and Sell Stock---只能买卖股票一次的最大收益
- Leetcode 122 Best Time to Buy and Sell Stock II 不限次数买卖股票最大收益
- 在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 122. Best Time to Buy and Sell Stock II (求股票买卖最大收益)
- leetcode——Best Time to Buy and Sell Stock III 买卖股票最大收益(AC)
- Leetcode 123 Best Time to Buy and Sell Stock III 至多两次买卖股票最大收益
- Leetcode 121 Best Time to Buy and Sell Stock 单次买卖股票最大收益
- 找出买卖股票的最大收益及其时间
- 一段时间内两次买进卖出股票使得收益最大(C++版)
- 股票最大收益问题
- 最大数字序列和问题,买卖股票问题,以及最长公共字串问题
- 股票最大收益 Best Time to Buy and Sell Stock II
- 第四章 最大子数组问题(股票最大收益) C++实现 算法导论
- 小米笔试-股票最大收益(动态规划)
- 如何买卖股票
- 面试题38:股票最大收益问题