码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-15 22:02:24      阅读:46      评论:0      收藏:0      [点我收藏+]

标签:最小   ret   price   and   ati   必须   个数   表示   public   

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

标签:最小   ret   price   and   ati   必须   个数   表示   public   

原文地址:https://www.cnblogs.com/xym4869/p/12499592.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!