今天跟大伙分享下关于数组中差值的最大值(寻找一个数组中左侧最大值与右侧最小值的差值)的计算思路的算法题,解决方案有许多,这里简单进行抛砖引玉。
题目一:
数组中差值的最大值(寻找一个数组中左侧最大值与右侧最小值的差值)
给你一段时间的代码量数组,求出代码量减少值即差值的最大值,如果代码量是一直递增,则返回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;
}