leetcode 121. 买卖股票的最佳时机

题目

leetcode 121. 买卖股票的最佳时机_第1张图片

思路

遍历三次,维护两个数组:

  • 第一次从前向后遍历,生成“左边最小”数组
  • 第二次从后向前遍历,生成“右边最大”数组
  • 第三次从前向后遍历,用“右边最大”数组减去左边最小”数组,找出最大值

例如,prices = {7, 1, 5, 3, 6, 4};

左边最小 [7, 1, 1, 1, 1, 1]
右边最大 [7, 6, 6, 6, 6, 4]
差值    [0, 5, 5, 5, 5, 3]
故最大差值为:5

另外,注意添加输入空数组的判断,避免越界异常。

题解

class Solution {
    // O(n) 复杂度
    public int maxProfit(int[] prices) {
        // 空值校验
        if (prices.length == 0) return 0;

        int len = prices.length;
        int leftMinArr[] = new int[len];// 辅助数组:左边的最小数
        int rightMaxArr[] = new int[len];// 辅助数组:右边的最大数

        leftMinArr[0] = prices[0];
        rightMaxArr[len - 1] = prices[len - 1];

        //左边最小
        for (int i = 1; i < len; i++) {
            if (prices[i] < leftMinArr[i - 1]) {
                leftMinArr[i] = prices[i];
            } else {
                leftMinArr[i] = leftMinArr[i - 1];
            }
        }

        //右边最大
        for (int i = len - 2; i >= 0; i--) {
            if (prices[i] > rightMaxArr[i + 1]) {
                rightMaxArr[i] = prices[i];
            } else {
                rightMaxArr[i] = rightMaxArr[i + 1];
            }
        }

        //最大差值
        int max = 0;
        for (int i = 0; i < len; i++) {
            int diff = rightMaxArr[i] - leftMinArr[i];
            if (max < diff) {
                max = diff;
            }
        }
//        System.out.println(Arrays.toString(leftMinArr));
//        System.out.println(Arrays.toString(rightMaxArr));

        return max;
    }

    //测试用例
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] prices = {7, 1, 5, 3, 6, 4};
        int res = solution.maxProfit(prices);
        System.out.println(res);
    }

}

leetcode 121. 买卖股票的最佳时机_第2张图片

附:在评论区看到的最优解

从前向后遍历一次
记录当前遇到的最小值和最大值
注意 最大值应该在最小值之后, 因此 若最小值更新了就把最大值也更新成与之相同
每次得出最大值和最小值的时候就和max比较取最大

C语言:

int maxProfit(int* prices, int pricesSize){
    if(pricesSize==0) return 0;
    int result=0,max=prices[0],min=prices[0];
    for(int i=1;i<pricesSize;i++)
    {
        if(prices[i]>max)   //股票价格上升了
        {
            max=prices[i];
            result=fmax(max-min,result);
        }
        else if(prices[i]<min)  //最低价格下降了
        {
            min=max=prices[i];
        }
    }
    return result;
}

你可能感兴趣的:(leetcode)