Leetcode hot100 买卖股票的最佳时机【简单】

拿到一个题,看透他的本质,用自己的话表达出来。首先凭直觉,好了,没有直觉。

那就先想出一个最暴力的方法解决了它,然后再想哪里可以优化?

非常容易想到,双层循环,外层循环遍历所有买入的日期for(int i=0;i<length-1;i++),内层循环遍历所有可能卖出的日期for(j=i+1; j<length;j++)。

优化的思路一般是重复利用历史数据 / 从历史数据中提取有价值的信息避免重复遍历 ,但是我们是从左往右遍历,指针i遍历过的历史数据都在左边,而未来要遍历的的数据j都在右边,没法重复利用左边遍历过的数据。或者换个角度想,内层循环每次遍历的个数都比上一次少一个,只有比上次多的时候才能利用历史数据,比上次循环少一个的时候无法利用,当然这本质上也是因为外层遍历过的数据都在左边,而内层要遍历的都在右边导致的。(这一段头疼的话可以不看,别绕晕了)

只需要巧妙的换一个思路。

依然是双层循环,只不过外层循环遍历卖出的日期for(int i=1;i<length;i++),内层循环遍历所有可能买入的日期for(j=0;j<i;j++)。如此,外层指针i是从左往右遍历的,遍历过的历史数据都在左边,而内层j也是从左边开始遍历的!在脑海里过一遍,发现内层循环每次都是重复的呀,这就可以利用历史数据,省去内层循环了。我们用minPrice去记录历史数据。

java 复制代码
public class Solution {
    public int maxProfit(int[] prices) {
        //特殊情况
        if(prices.length<2) return 0;
        
        int minPrice=prices[0]; //记录卖出日期前面的最小值
        int maxProfit=0;
        for(int out=1; out<prices.length; out++){
            //进入下一轮,更新minPrice
            minPrice = Math.min(minPrice,prices[out-1]);
            //
            maxProfit=Math.max(maxProfit,prices[out]-minPrice);
            
        }
        return maxProfit;
    }
}

时间复杂度:O(n)

空间复杂度:O(1) ,多用了一个int minPrice

法(二)双指针

这个解法比较巧妙,属于"灵机一动"或者直觉想出来的。

维护两个指针left和right,两个指针都从左边出发往右走。

left指向当前已知买入价最低的日期,right从left开始,去遍历卖出的日期,如果priceright>priceleft,那就计算利润,如果priceright<priceleft,就说明又找了一个更低的买入日期,left指向这个最新的买入日期。。。

java 复制代码
public class Solution {
    public int maxProfit(int[] prices) {
        //特殊情况
        if(prices.length<2) return 0;

        int left=0;
        int right=left+1;
        int maxProfit=0;
        while(right<prices.length){
            if(prices[right]>prices[left]){
                maxProfit=Math.max(maxProfit,prices[right]-prices[left]);
                right=right+1; //买入日期不变,继续遍历下一个卖出日期
            }else{
                left=right; //发现更低的买入日期!
                right=left+1;  //卖出日期
            }
        }
        return maxProfit;
    }
}
相关推荐
不正经学生10 分钟前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥3 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
圣保罗的大教堂3 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
晊晌_h4 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦5 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
丰锋ff6 小时前
面试问题合集
面试·职场和发展
颜挺锐6 小时前
如何轻松通过性能测试之第四篇:性能测试项目怎么交付?一文讲透九步实施流程(附面试话术 + 实战清单)
面试·职场和发展