每日一题-数组 **leetcode122

360 阅读1分钟

一、题目描述

二、存在的问题

没有思路解决多次买卖的问题,一次买卖的问题可以考虑到首先找到最小值,如果当前值不是最小值,则判断当前值减最小值是否大于最大收益(if else可以减少遍历次数),一次遍历就解决了。

三、题解思路

对于多次买卖问题,因为不存在同时存在多笔交易,即不可以持有股票的同时继续买入。一次遍历同样可以解决:首先找到谷值,再找到峰值卖出,继续进行谷买入,峰卖出的操作,需要理解一个数学问题:遇到谷买入,遇到峰卖出是可以实现最大收益的。

四、提交代码

class Solution {
    public int maxProfit(int[] prices) {
        int i =0;
        int low = prices[i];
        int high = prices[i];
        int maxProfit =0;
        while(i < prices.length-1){
            while(i < prices.length -1 && prices[i]>= prices[i+1]){
                i++;
            }
            low = prices[i];
            while(i < prices.length -1 && prices[i]<= prices[i+1]){
                i++;
            }
            high = prices[i];
            maxProfit += high -low;
        }
        return maxProfit;
    }
}

五、注意事项

当求谷值时,如果当前元素大于后一个元素,则索引加一,直至求得谷值,而对于峰值是当前元素小于后一个元素,则索引加一,这其中,求得谷值之时,后一个元素必定小于其后一个元素(否则不会跳出while循环),但不能在更新谷值之后添加i++;代码减少求峰值时的判断次数,因为while(){}循环,是在执行完{}中的所有代码才做循环变量的判断,对于上述情况,如果i指向了最后一个元素,再加1则越界,会执行到high = prices[i]代码,出现越界错误