股票交易一次,两次,无限次java实现

牛客刷题:股票交易一次,两次,无限次java实现


1.假设你有一个数组,其中第 i 个元素是股票在第 i 天的价格。你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。设计一个算法来计算可以获得的最大收益。

// An highlighted block
/**
 * 股票一次买卖:双指针算法
 *
 * @auther gaowenbin
 * @create 2021-03-27-14:26
 */
public class gupiaodanci {
    public static int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int maxPro = 0;
        int min = prices[0];
        for (int i = 0; i < prices.length; i++) {
            min = Math.min(min, prices[i]);
            maxPro = Math.max(maxPro, prices[i] - min);
        }
        return maxPro;
    }

    public static void main(String[] args) {
        System.out.println(maxProfit(new int[]{7,1,5,3,6,4}));
    }
}

2.假定你知道某只股票每一天价格的变动。你最多可以同时持有一只股票。但你最多只能进行两次交易(一次买进和一次卖出记为一次交易。买进和卖出均无手续费)。设计一个函数,计算你所能获得的最大收益。

import java.util.*; 
public class Solution {
    /**
	   动态规划
     * 两次交易所能获得的最大收益
     * @param prices int整型一维数组 股票每一天的价格
     * @return int整型
     */
    public int maxProfit (int[] prices) {
        // write code here
        if (prices.length == 0) return 0;
        /*
        5个状态:1)不操作2)第一次购买3)第一次卖出4)第二次购买5)第二次卖出
        dp[i][j]代表第i天状态为j时产生的最大收益
        */
        int [][]dp = new int[prices.length][5];
        //初始化
        dp[0][1] = -prices[0];
        dp[0][3] = -prices[0];
        for (int i = 1; i < prices.length; i++) {
            dp[i][0] = dp[i - 1][0];
            //其中dp[i][1]有两个操作1)第i天没有操作2)第i天买入股票,所以此时最大收益,应该为这两个操作比大小
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
            //其中dp[i][2]有两个操作1)第i天没有操作2)第i天卖出股票,所以此时最大收益,应该为这两个操作比大小
            dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
            //其中dp[i][3]有两个操作1)第i天没有操作2)第i天买入股票,所以此时最大收益,应该为这两个操作比大小
            dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
            //其中dp[i][4]有两个操作1)第i天没有操作2)第i天卖出股票,所以此时最大收益,应该为这两个操作比大小
            dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
        }
        return dp[prices.length - 1][4];
 
    }
}

3.假定你知道某只股票每一天价格的变动。你最多可以同时持有一只股票。但你可以无限次的交易(买进和卖出均无手续费)。设计一个函数,计算你所能获得的最大收益。

/**
 * 股票交易(无限次):
 * 可以简化成,只要是两天之间是上涨的,那我们就要这一段的收益。
 *
 * @auther gaowenbin
 * @create 2021-03-27-14:59
 */
public class gupiaowuxianci {
    public static int maxProfit (int[] prices) {
        if (prices == null || prices.length ==0){
            return 0;
        }
        int maxPro = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i]>prices[i-1]){
                maxPro += prices[i]-prices[i-1];
            }
        }
        return maxPro;
    }

    public static void main(String[] args) {
        System.out.println(maxProfit(new int[]{1,2,3,4,5}));
    }
}

你可能感兴趣的:(java,数据结构,算法)