LeetCode——best-time-to-buy-and-sell-stock i-ii-iii

Posted Shaw_喆宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——best-time-to-buy-and-sell-stock i-ii-iii相关的知识,希望对你有一定的参考价值。

Q:假设你有一个数组,其中第i个元素是某只股票在第i天的价格。
如果你最多只能完成一笔交易(即买一股和卖一股股票),设计一个算法来求最大利润。
A:当前值比最小值小,代替最小值;当前值比最小值大,计算差值,和之前的差值做判断。

    public int maxProfit(int[] prices) {
        if (prices.length == 0)
            return 0;
        int sum = 0;
        int min = prices[0];
        for (int i = 1; i < prices.length; i++) {
            if (min < prices[i])
                sum = Math.max(sum, prices[i] - min);
            else if (min > prices[i])
                min = prices[i];
        }
        return sum;
    }

Q:假设你有一个数组,其中第i个元素表示某只股票在第i天的价格。
设计一个算法来寻找最大的利润。你可以完成任意数量的交易(例如,多次购买和出售股票的一股)。但是,你不能同时进行多个交易(即,你必须在再次购买之前卖出之前买的股票)。
A:所有的涨坡的最高点减最低点

    public static int maxProfit(int[] prices) {
        if (prices.length <= 1)
            return 0;
        int min = prices[0];
        int sum = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i] < min)
                min = prices[i];
            if (prices[i] > min && (i == prices.length - 1 || prices[i] >= prices[i + 1])) {
                sum += (prices[i] - min);
                min = prices[i];
            }
        }
        return sum;
    }

Q:假设你有一个数组,其中第i个元素是某只股票在第i天的价格。
设计一个算法来求最大的利润。你最多可以进行两次交易。
注意:
你不能同时进行多个交易(即,你必须在再次购买之前出售之前买的股票)。
A:结合一下前两个代码,在每个峰值计算一次前后两个子数组的最大利润,相加比较。

    public static int maxProfit(int[] prices) {
        if (prices.length <= 1)
            return 0;
        int min = prices[0];
        int sum = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i] < min)
                min = prices[i];
            //找到峰值的时候
            if (prices[i] > min && (i == prices.length - 1 || prices[i] >= prices[i + 1])) {
                int left = max(Arrays.copyOfRange(prices, 0, i + 1));
                int right = 0;
                if (i != prices.length - 1) {
                    right = max(Arrays.copyOfRange(prices, i + 1, prices.length));
                }
                sum = Math.max(sum, (left + right));
                min = prices[i];
            }
        }
        return sum;
    }

    public static int max(int[] prices) {
        if (prices.length == 0)
            return 0;
        int sum = 0;
        int min = prices[0];
        for (int i = 1; i < prices.length; i++) {
            if (min < prices[i])
                sum = Math.max(sum, prices[i] - min);
            else if (min > prices[i])
                min = prices[i];
        }
        return sum;
    }

以上是关于LeetCode——best-time-to-buy-and-sell-stock i-ii-iii的主要内容,如果未能解决你的问题,请参考以下文章

如何做LeetCode

leetcode可以写在简历上吗

[Leetcode]leetcode1-10题随记

leetcode分类刷题(续2)

leetcode分类刷题

LintCode,hihoCoder,LeetCode有啥区别