其他分享
首页 > 其他分享> > 买卖股票4题

买卖股票4题

作者:互联网

121. 买卖股票的最佳时机

步骤

1. 第一个元素默认是最小元素,最大收益默认是0。
2. 从第二个元素开始遍历,如果当前元素与最小元素差超过最大收益,那么更新最大收益;如果当前元素比最小元素还要小,那么更新最小元素。

Go代码

func maxProfit(prices []int) int {
	profit := 0
	minPrice := prices[0]
	for i := 1; i < len(prices); i++ {
		if prices[i] - minPrice > profit {
			profit = prices[i] - minPrice
		} else if prices[i] < minPrice {
			minPrice = prices[i]
		}
	}
	return profit
}

Java代码

class Solution {
    public int maxProfit(int[] prices) {
        int profit = 0;
        int minPrice = prices[0];

        for (int i = 1; i < prices.length; i++) {
            if (prices[i] - minPrice > profit) {
                profit = prices[i] - minPrice;
            } else if (prices[i] < minPrice) {
                minPrice = prices[i];
            }
        }

        return profit;
    }
}

122. 买卖股票的最佳时机 II

步骤

多次买卖股票,如果当前值大于前者,那么累加差值。

GO代码

func maxProfit(prices []int) int {
	res := 0
	for i := 1; i < len(prices); i++ {
		if prices[i] > prices[i - 1] {
			res += prices[i] - prices[i - 1]
		}
	}
	return res
}

Java代码

class Solution {
    public int maxProfit(int[] prices) {
        int profit = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i] > prices[i - 1]) {
                profit += prices[i] - prices[i - 1];
            }
        }
        return profit;
    }
}

123. 买卖股票的最佳时机 III

步骤

任意一天结束后,只有无操作、第1次买入、第1次卖出、第2次买入和第2次卖出共5种状态。
第1次买入时股票价格记为buy1,第1次卖出时利润记为sell1,第2次买入时股票价格记为buy2,第2次卖出时累计利润记为sell2。
1. 初始状态,针对第1个股票价格,buy1是prices[0],sell1是0(考虑当天就卖出,利润是0),buy2是prices[0](当天第1次卖出后第2次买入),sell2是0(考虑当天就卖出,利润是0)。
2. 遍历后面的股票价格,如果当前股票价格比buy1更小则更新buy1,如果当前股票价格与buy1的差值比sell1更大则更新sell1,如果当前股票价格扣除sell1(第1次买卖股票所得利润)比buy2更小则更新buy2,如果当前股票价格与buy2的差值比sell2更大则更新sell2。

Java代码

class Solution {
    public int maxProfit(int[] prices) {
        int buy1 = prices[0];
        int sell1 = 0;
        int buy2 = prices[0];
        int sell2 = 0;

        for (int i = 1; i < prices.length; i++) {
            buy1 = Math.min(buy1, prices[i]);
            sell1 = Math.max(sell1, prices[i] - buy1);
            buy2 = Math.min(buy2, prices[i] - sell1);
            sell2 = Math.max(sell2, prices[i] - buy2);
        }

        return sell2;
    }
}

188. 买卖股票的最佳时机 IV

步骤

模仿买卖股票的最佳时机 III中只能进行2次交易的做法。
1. 初始化buys和sells。
2. 遍历prices,更新buys和sells。

Java代码

class Solution {
    public int maxProfit(int k, int[] prices) {
        if (prices.length == 0 || k == 0) {
            return 0;
        }

        int[] buys = new int[k];
        int[] sells = new int[k];
        for (int i = 0; i < k; i++) {
            buys[i] = prices[0];
            sells[i] = 0;
        }

        for (int i = 1; i < prices.length; i++) {
            buys[0] = Math.min(buys[0], prices[i]);
            sells[0] = Math.max(sells[0], prices[i] - buys[0]);

            for (int j = 1; j < k; j++) {
                buys[j] = Math.min(buys[j], prices[i] - sells[j - 1]);
                sells[j] = Math.max(sells[j], prices[i] - buys[j]);
            }
        }

        return sells[k - 1];
    }
}

 

标签:买卖,int,股票,profit,buys,prices,sells,minPrice
来源: https://www.cnblogs.com/WJQ2017/p/15967640.html