Best Time to Buy and Sell Stock

本文讨论了如何通过遍历数组来确定买卖股票的最佳时机,以获取最大收益。文章中提出了两种解决方法:一种是通过设置最大和最小变量进行迭代计算,另一种则是采用一维动态规划策略。文中详细解释了每种方法的原理、实现过程及代码实现。

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/

题意:给你一个数组,得出两个数a和b的差值最大的差值,其中b的下标大于a的下标

分析:

1)首先设两个变量max和min分别指向数组第一个元素,然后遍历数组;会有以下三种情况出现:

a)、当前元素大于max,则说明差值在增大趋势,只记录当前最大值即可;

b)、当前元素小于min,说明可以把之前的一段数据中的max和min的差单独计算出来了,因为就算后面这个元素比之前一段的min要小,可是其下标大啊,并无卵用,其只对其后面的元素有用!so计算出差值,与当前最大currentMax比较大小,若大于则更新currentMax;

c)、当前元素大于min小于max,在min和max之间可以不予处理

2)、最终遍历完之后,还需要再计算下max和min的差,因为上面只在当前元素小于min的时候计算二者差值,若数组一直持续增长趋势则不会计算差值,so需要最后计算下差值!

public class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length <= 1){
            return 0;
        }
        
        int min = prices[0];
        int max = prices[0];
        int currentMax = Integer.MIN_VALUE, tmp;
        for(int i = 1; i < prices.length; i++){
            if(prices[i] > max){
                max = prices[i];
            }
            else if(prices[i] < min){
                tmp = max - min;
                if(tmp > currentMax){
                    currentMax = tmp;
                }
                min = prices[i];
                max = prices[i];
            }
        }
        tmp = max - min;
        if(tmp > currentMax){
            currentMax = tmp;
        }
        
        return currentMax;
    }
}


2)、一维动态规划问题:dp[i + 1] = max{dp[i], prices[i+1} - minPrice};minPrice是0,1,2。。。i区间内的最小值;我们要求解的最大利润max = max{dp[0], dp[1], d[2],....dp[n-1]}

代码如下:

public class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length <= 1){
            return 0;
        }
        int result = prices[1] - prices[0];
        int minPrice = prices[0];
        for(int i = 2; i < prices.length; i++){
            minPrice = Math.min(prices[i - 1], minPrice);
            if(result < prices[i] - minPrice){
                result = prices[i] - minPrice;
            }
        }
        if(result < 0){
            return 0;
        }
        else{
            return result;
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值