https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
题意:给你一个数组,得出两个数a和b的差值最大的差值,其中b的下标大于a的下标
分析:
1)首先设两个变量max和min分别指向数组第一个元素,然后遍历数组;会有以下三种情况出现:
a)、当前元素大于max,则说明差值在增大趋势,只记录当前最大值即可;
b)、当前元素小于min,说明可以把之前的一段数据中的max和min的差单独计算出来了,因为就算后面这个元素比之前一段的min要小,可是其下标大啊,并无卵用,其只对其后面的元素有用!so计算出差值,与当前最大currentMax比较大小,若大于则更新currentMax;
c)、当前元素大于min小于max,在min和max之间可以不予处理
2)、最终遍历完之后,还需要再计算下max和min的差,因为上面只在当前元素小于min的时候计算二者差值,若数组一直持续增长趋势则不会计算差值,so需要最后计算下差值!
public class Solution {
public int maxProfit(int[] prices) {
if(prices.length <= 1){
return 0;
}
int min = prices[0];
int max = prices[0];
int currentMax = Integer.MIN_VALUE, tmp;
for(int i = 1; i < prices.length; i++){
if(prices[i] > max){
max = prices[i];
}
else if(prices[i] < min){
tmp = max - min;
if(tmp > currentMax){
currentMax = tmp;
}
min = prices[i];
max = prices[i];
}
}
tmp = max - min;
if(tmp > currentMax){
currentMax = tmp;
}
return currentMax;
}
}
代码如下:
public class Solution {
public int maxProfit(int[] prices) {
if(prices.length <= 1){
return 0;
}
int result = prices[1] - prices[0];
int minPrice = prices[0];
for(int i = 2; i < prices.length; i++){
minPrice = Math.min(prices[i - 1], minPrice);
if(result < prices[i] - minPrice){
result = prices[i] - minPrice;
}
}
if(result < 0){
return 0;
}
else{
return result;
}
}
}