[leetCode]122.买卖股票的最佳时机II

一次遍历

下面是自己写的一次遍历,思路是每次找到波谷min后开始爬坡,如果没有到转折点就将这次利润和上次利润进行比较,如果大于上次利润累加器sum就加上这次利润减去上次利润将利润最大化

class Solution {
    public int maxProfit(int[] prices) {
        int min = 0;
        int prfit = 0;
        int sum = 0;
        for(int i = 1; i < prices.length; i++){
            if(prices[i] < prices[i-1]) {//更新最小值到达谷底
                min = i;
                prfit = 0;
            }else if(prices[i] > prices[min] && prices[i] > prices[i-1]){//在上升时不断更新prift
                int temp = prfit;//上次利润
                prfit = prices[i] - prices[min];//当前利润
                if(prfit > temp){//如果当前利润比上次利润多则加上这次利润,减去上次利润
                     sum = sum + prfit - temp;
                }
            }
        }
        return sum;
    }
}

下面是官方的一次遍历,每次爬坡将一小段的利润累加,使得利润最大化

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

峰谷法

寻找曲线的每个波谷和波峰,计算之间的利润,将所有波峰波谷之间的利润求和

class Solution {
    public int maxProfit(int[] prices) {
        int i = 0;
        int valley = prices[0];//波谷
        int peak = prices[0];//波峰
        int maxProfit = 0;
        while(i < prices.length -1){
            //从波峰开始寻找波谷
            while(i < prices.length - 1 && prices[i] >= prices[i+1])
                ++i;
            valley = prices[i];
            //从波谷开始攀爬寻找波峰
            while( i < prices.length - 1 && prices[i] <= prices[i + 1])
                ++i;
            peak = prices[i];
            maxProfit += peak - valley;
        }
        return maxProfit;
    }
}
posted @ 2020-07-14 10:10  消灭猕猴桃  阅读(50)  评论(0编辑  收藏  举报