题面:你有一个数组,第i个元素是第i天给定股票的价格。 如果只允许最多完成一个交易(即购买一个交易,并出售股票一个),则设计一个算法来找到最大利润。
Example 1:
Input: [7, 1, 5, 3, 6, 4]
Output: 5
max. difference = 6-1 = 5 (not 7-1 = 6, as selling price needs to be larger than buying price)
Example 2:
Input: [7, 6, 4, 3, 1]
Output: 0
In this case, no transaction is done, i.e. max profit = 0.
问题分析:购入点必须在售出点之前,且一般的两层for循环会超时
思路描述:建立两个辅助数组,分别为最小辅助和最大辅助,最小辅助从前往后遍历(i++),将前i个数的最小值填到本数组的第i位;最大辅助数组思路类似,从后往前遍历;最后求出两个辅助数组对应同一个i的最大正差值即可
Solution:
class Solution {
public int maxProfit(int[] prices) {
int length=prices.length;
int[] minP=new int[length];
int[] maxP=new int[length];
int profit=0;
if(length<=0)
return 0;
int max=prices[length-1];
int min=prices[0];
for(int i=0;i<length;i++){
if(min>prices[i]){
min=prices[i];
}
minP[i]=min;
}
for(int j=length-1;j>0;j--){
if(max<prices[j])
max=prices[j];
maxP[j]=max;
}
int maxProf=0;
for(int i=0;i<length;i++){
profit=maxP[i]-minP[i];
if(profit>maxProf)
maxProf=profit;
}
return maxProf;
}
}