您的位置:首页 > 编程语言 > Java开发

如何买卖股票以获得最大收益 java算法

2013-01-25 15:34 274 查看
已知一段时间内股价有涨跌,例如 {3,6,1,4,7,3,8,8,3,5}.求最大获利是多少。不能买空卖空。

例如,上例应该是第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。

上面代码中最巧妙的地方是当当天的股票值小于前期的低点时,才会去更新阶段最低股票值。也就是说,股票没有跌破前面几天的最低点的小波动,仍然被算作一个上升期。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐