解决Java中的股市难题,获取最大利润

时间:2016-01-05 21:54:26

标签: java algorithm

需要最大利润。

如果我只能购买一次并卖出一次,我可以修改哪些以获得最大利润? 意味着如果我在5买入并以150卖出其最大利润。

目前我所做的是在价格低于第二天时买入,如果价格超过第二天则卖出。

显然我们要记住,我们只能在买入后卖出,意味着卖出指数不能在买入指数之前。

到目前为止,我所做的是:

package com;

public class Stock {

    public static void main(String[] args) {

        int[] prices = {20,10,70,80,5,150,67};
        int length = prices.length-2;
        int buy=0;
        int sell=0;
        int buyIndex=-1;
        int sellIndex=-1;

        int i=0;
        for (i =0 ; i<=length ;i++ ){

            // buy logic start
            if(prices[i]<prices[i+1]){
                if(i>buyIndex){
                    buy= prices[i];
                    buyIndex=i; 
                    System.out.println("buy"+buy);
                    System.out.println("buyIndex"+buyIndex);
                }               
            } // buy logic finish


         // sell logic start
            if(buy!=0 && i>buyIndex ){
                System.out.println("inside sell logic");
                if(prices[i]>prices[i+1]){
                    sell = prices[i];
                    sellIndex = i;
                    System.out.println("sell"+sell);
                    System.out.println("sellIndex"+sellIndex);

                }
            } // sell logic end
        } // for loop end

    } // main end

}

输出

buy10
buyIndex1
buy70
buyIndex2
inside sell logic
sell80
sellIndex3
buy5
buyIndex4
inside sell logic
sell150
sellIndex5

1 个答案:

答案 0 :(得分:1)

您可以定义2个辅助阵列:min和max,其中:

i

直观地说,min [i]是在max之前(或之前)看到的最小数字。

相似,max[0] = array[n-1] max[i] = max(max[i+1], array[i]) 0 <= i < n-1

i

直观地说,max [i]是max[i] - min[i]之后或之后的最大数字。

现在,一旦您拥有这些数组,i就是最多可以在i天购买并且至少在日期i出售的股票所实现的最大利润。如果遍历所有0 <= i < n s,这基本上是有效事务的定义。
如果你查看所有{{1}},你会找到最佳解决方案。

(注意,通过记住本地最小值,优化可以消除额外空间的需要,但我从额外的空间解决方案开始,在我看来,它具有更清晰的逻辑)

祝你好运!