https://blog.csdn.net/jike11231/article/details/135579377

今天跟大伙分享下关于数组中差值的最大值(寻找一个数组中左侧最大值与右侧最小值的差值)的计算思路的算法题,解决方案有许多,这里简单进行抛砖引玉。

题目一:

数组中差值的最大值(寻找一个数组中左侧最大值与右侧最小值的差值)

给你一段时间的代码量数组,求出代码量减少值即差值的最大值,如果代码量是一直递增,则返回0

例子1

records=[370,400,420,390,350,430,400\]

输出:70

解释:

左侧420和右侧350之间的差值最大,则输出70

例子2 records=[300,400,420,490,550,551,600\]

输出:0

两种思路解决,第一种思路是暴力双重for循环,第二种思路双指针滑动窗口解决。

第一种思路是暴力双重for循环:

 public static int getMaxSubNum(int[] records) {
        int maxSubNum = 0;
        for (int i = 0; i < records.length - 1; i++) {
            for (int j = i + 1; j < records.length; j++) {
                if (records[i] > records[j]) {
                    maxSubNum = Math.max(maxSubNum, records[i] - records[j]);
                }
            }
        }
        return maxSubNum;
    }

第二种思路双指针滑动窗口解决:

public static int getMaxSubNumIndex(int[] records) {
        int maxSubNum = 0;
        int left = 0;
        int right = 1;
        while (right < records.length) {
            if (records[left] < records[right]) {
                left++;
            } else {
                maxSubNum = Math.max(maxSubNum, records[left] - records[right]);
                right++;
            }
        }
        return maxSubNum;
    }

我们可以举一反三,利用这2个思路解决下力扣算法:股票的最大利润问题

题目二:

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例 1:

输入: \[7,1,5,3,6,4\]

输出: 5

解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 => 6)的时候卖出,最大利润 = 6-1 = 5 。

注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: \[7,6,4,3,1\]

输出: 0

解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

第一种思路是暴力双重for循环:

int maxProfit = 0;
        for (int i = 0; i < prices.length; i++) {
            for (int j = i + 1; j < prices.length; j++) {
                if (prices[i] < prices[j]) {
                    maxProfit = Math.max(maxProfit, prices[j] - prices[i]);
                }
            }
        }
        return maxProfit;

第二种思路双指针滑动窗口解决:

public static int maxProfitIndex(int[] prices) {
        int maxProfit = 0;
        int left = 0;
        int right = 1;
        while (right < prices.length) {
            if (prices[left] > prices[right]) {
                left++;
            } else {
                maxProfit = Math.max(maxProfit, prices[right] - prices[left]);
                right++;
            }

        }
        return maxProfit;
    }

给定一个整数数组prices,其中第 prices\[i\] 表示第 i 天的股票价格 。

在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。 返回 你能获得的最大利润 。

示例 1:

输入: \[7,1,5,3,6,4\]

输出: 5

解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出,最大利润 = 5-1 = 4 。

在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-3 = 3 。

最大利润4+3=7。

代码如下:

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