给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 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。
暴力解决方法:定义max表示获取最大值,min表示当前遍历的最小值。遍历数组,找出第一个arr[i]<arr[i+1]的arr[i],将它作为最小值min = arr[i],此时max = arr[i+1]-arr[i];
继续遍历如果此时arr[i]<arr[i+1]并且arr[i]<min,我们将arr[i]赋给min,然后取max = Math.max(max,arr[i+1]-min);
如果此时arr[i]<arr[i+1]max = Math.max(max,arr[i+1]-min);最后返回max
代码如下:
public int maxProfit(int[] arr) {
int len = arr.length;
if(len == 0) return 0;
//表示当前遍历数组中最小值
int min = 0;
//作为标记
int count = 0;
//获取的最大利润
int max = 0;
for(int i = 0;i<len-1;i++){
//找出第一个arr[i]<arr[i+1]的arr[i]
if(arr[i]<arr[i+1] && count == 0){
min = arr[i];
count++;
max = arr[i+1] - arr[i];
}
//找到arr[i]<arr[i+1]并且arr[i]<min,将arr[i]赋给min,再次计算此时的最大利润
else if(arr[i]<arr[i+1] && arr[i]<min){
min = arr[i];
max = Math.max(max,arr[i+1] - min);
}
//计算此时的最大利润
else if(arr[i]<arr[i+1]){
max = Math.max(max,arr[i+1] - min);
}
}
return max;
}
上面代码优化一下:可采用动态规划的方法去做,思想和暴力法一样,代码优化了
代码如下:
public int maxProfit(int[] arr) {
int len = arr.length;
if(len == 0) return 0;
//表示当前遍历数组中最小值
int min = arr[0];
//获取的最大利润
int max = 0;
for(int i = 0;i<len;i++){
max = Math.max(max,arr[i] - min);
min = Math.min(min,arr[i]);
}
return max;
}