买卖股票的最佳时机

例题:

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

分析:

题目说了,某一天买入股票,未来任意一天卖出,只卖一次,求最大利润,i 尝试买入,j 尝试卖出。

站在上帝视角,我们能清楚地知道股票每一天的价格,一开始,我们假设从第0天买入股票,j 肯定要比 i 大,因为要在未来某一天卖出,i = 0, j = 1,这个时候股票是遇跌的,因此,我们尝试在股票跌的那一天买入,也就是 i = j,j++,如下图:

 

这时发现股票有涨幅,但不一定第 j 天卖出的利润最大,还需观察,先把第j天卖出的利润记录下来,接着 i 不变, j++,

此时到第j天卖出仍有涨,所以i不变,j++,一直找到最大利润

我们能发现一个规律:当遇到涨时,i不变,j++, 遇到跌时,i 变为 j, j++

代码实现:
package leetcodeup;

public class ShareslLeetcode121 {
    public static int maxProfit(int[] prices) {
        int i = 0;
        int j = 1;
        int max = 0;
        while(j < prices.length){
            if(prices[j] - prices[i] > 0){ //涨
                max = Math.max(prices[j] - prices[i], max);
            }else{ //跌
                i = j;
            }
            j++;
        }
        return max;
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值