《漫画算法2》源码整理-9 股票交易最大收益

Posted GarfieldEr007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《漫画算法2》源码整理-9 股票交易最大收益相关的知识,希望对你有一定的参考价值。

股票交易最大收益

public class StockProfit 

    public static int maxProfitFor1Time(int prices[]) 
        if(prices==null || prices.length==0) 
            return 0;
        
        int minPrice = prices[0];
        int maxProfit = 0;
        for (int i = 1; i < prices.length; i++) 
            int profit = prices[i] - minPrice;
            if(profit > maxProfit)
                maxProfit = profit;
             else if (prices[i] < minPrice) 
                minPrice = prices[i];
            
        
        return maxProfit;
    

    public static int maxProfitForAnyTime(int[] prices) 
        int maxProfit = 0;
        for (int i = 1; i < prices.length; i++) 
            if (prices[i] > prices[i-1])
                maxProfit += prices[i] - prices[i-1];
        
        return maxProfit;
    

    //最大买卖次数
    private static int MAX_DEAL_TIMES = 2;

    public static int maxProfitFor2Time(int[] prices) 
        if(prices==null || prices.length==0) 
            return 0;
        
        //表格的最大行数
        int n = prices.length;
        //表格的最大列数
        int m = MAX_DEAL_TIMES*2+1;
        //使用二维数组记录数据
        int[][] resultTable = new int[n][m];
        //填充初始状态
        resultTable[0][1] = -prices[0];
        resultTable[0][3] = -prices[0];
        //自底向上,填充数据
        for(int i=1;i<n;++i) 
            for(int j=1;j<m;j++)
                if((j&1) == 1)
                    //j为奇数的情况
                    resultTable[i][j] = Math.max(resultTable[i-1][j], resultTable[i-1][j-1]-prices[i]);
                else 
                    //j为偶数的情况
                    resultTable[i][j] = Math.max(resultTable[i-1][j], resultTable[i-1][j-1]+prices[i]);
                
            
        
        //返回最终结果
        return resultTable[n-1][m-1];
    

    public static int maxProfitFor2TimeV2(int[] prices) 
        if(prices==null || prices.length==0) 
            return 0;
        
        //表格的最大行数
        int n = prices.length;
        //表格的最大列数
        int m = MAX_DEAL_TIMES*2+1;
        //使用一维数组记录数据
        int[] resultTable = new int[m];
        //填充初始状态
        resultTable[1] = -prices[0];
        resultTable[3] = -prices[0];
        //自底向上,填充数据
        for(int i=1;i<n;i++) 
            for(int j=1;j<m;j++)
                if((j&1) == 1)
                    //j为奇数的情况
                    resultTable[j] = Math.max(resultTable[j], resultTable[j-1]-prices[i]);
                else 
                    //j为偶数的情况
                    resultTable[j] = Math.max(resultTable[j], resultTable[j-1]+prices[i]);
                
            
        
        //返回最终结果
        return resultTable[m-1];
    

    public static int maxProfitForKTime(int[] prices, int k) 
        if(prices==null || prices.length==0 || k<=0) 
            return 0;
        
        //表格的最大行数
        int n = prices.length;
        //表格的最大列数
        int m = k*2+1;
        //使用一维数组记录数据
        int[] resultTable = new int[m];
        //填充初始状态
        for(int i=1;i<m;i+=2) 
            resultTable[i] = -prices[0];
        
        //自底向上,填充数据
        for(int i=1;i<n;i++) 
            for(int j=1;j<m;j++)
                if((j&1) == 1)
                    //j为奇数的情况
                    resultTable[j] = Math.max(resultTable[j], resultTable[j-1]-prices[i]);
                else 
                    //j为偶数的情况
                    resultTable[j] = Math.max(resultTable[j], resultTable[j-1]+prices[i]);
                
            
        
        //返回最终结果
        return resultTable[m-1];
    

    public static void main(String[] args) 
        int[] prices = 9,2,7,4,3,1,8,4;
        System.out.println(maxProfitFor1Time(prices));
        System.out.println(maxProfitForAnyTime(prices));
        System.out.println(maxProfitFor2Time(prices));
        System.out.println(maxProfitForKTime(prices, 3));
    




以上是关于《漫画算法2》源码整理-9 股票交易最大收益的主要内容,如果未能解决你的问题,请参考以下文章

股票交易日

股票交易日

P2569 股票交易

《漫画算法2》源码整理-2 图算法

A1-2017级算法上机第一次练习赛 G 股票交易

Leetcode题解——算法思想之贪心思想