java实现股票的最大利润(一次卖出,多次卖出)--中金所笔试题

一、股票的最大利润(一次卖出)

一个数组代表股票每天的价格,可以选择从某一天买入,然后之后的一天卖出,求能够获得的最大收益。

例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。在价格为5的时候买入并在价格为16时卖出,则能获得最大的利润为11.

思路:记录当前最小值和最大差值

          1.最大利润就是计算后面的数字减去前面的数字得到的一个最大的差值;

          2.求总体的最大差值,需要的数据:当前的最小值,当前的最大差值;遍历求解即可。

public class GuPiao {
    public static void main(String[] args){
        int[] prices={9,11,8,5,7,12,16,14};
        int result=new GuPiao().maxProfit(prices);
        System.out.println("最大收益为:"+result);
    }
    public int maxProfit(int[] arr){
        int len=arr.length;
        if(len<2)
            return 0;
        int minPrice=arr[0];
        int maxDiff=arr[1]-minPrice;
        for(int i=2;imaxDiff)
                maxDiff=curDiff;
        }
        return maxDiff;
    }
}

二、股票的最大利润(至多2次交易)

1. 分段考虑

    以i为分界线,前i天的最大和i天后面的最大,分两段进行每次的一个交易;两段的最大和,则为最大的利润;

   

//9,11,8,5,7,12,16,14
public static int maxProfit_2(int[] arr){
        int len=arr.length;
        if(len<=1)
            return 0;
        int[] maxFormer=new int[len];
        int[] maxLatter=new int[len];
        int day,diff,minPrice,maxPrice,maxProfit;
        //计算某一天及其之前所有时间内的最大利益
        minPrice=arr[0];
        maxProfit=0;
        maxFormer[0]=0;
        for(day=1;daymaxProfit)
                maxProfit=diff;     
            maxFormer[day]=maxProfit;
        }
        //计算某一天及其之后的所有时间内最大利益
        maxPrice=arr[len-1];
        maxProfit=0;
        maxLatter[len-1]=0;
        for(day=len-2;day>-1;day--){
            diff=maxPrice-arr[day];
            if(diff<0)
                maxPrice=arr[day];
            else if(diff>maxProfit)
                maxProfit=diff;
            maxLatter[day]=maxProfit;
        }
        //计算最大收益
        int sum;
        maxProfit=0;
        for(day=0;daymaxProfit)
                maxProfit=sum;
        }
        return maxProfit;

    }


 

 

 

股票的最大利润(可以对股票进行多次的买入和卖出

思路:前一天买入,盈利则第二天卖出

         1.如果第二天的价格高于第一天的价格就可以以第二天的价格卖出,则卖出后立即再次买入;

         2.如果第二天的价格低于第一天的价格,那么就在第一天结束前就卖出,相当于不盈利。

            所以,通过逐个相邻两数进行比较即可,如果后面的大,则记为利润。

   public int maxProfit_m(int[] arr){
        int len=arr.length;
        if(len<2)
            return 0;
        int maxProfit=0;
        for(int i=0;i0)
                maxProfit+=profit;
        }
        return maxProfit;
    }

 

 

 

你可能感兴趣的:(java实现股票的最大利润(一次卖出,多次卖出)--中金所笔试题)