最容易想到的就是brutal force traversing
public int maxProfit(int[] prices) {
int maxProfit=0;
for(int i=0;i<prices.length-1;i++){
for(int j=i+1;j<prices.length;j++){
if((prices[j]-prices[i])>maxProfit)
maxProfit=prices[j]-prices[i];
}
}
return maxProfit;
}
但是这个方法的时间复杂度是O(n²),这个是LeetCode给出的一个官方方法,但是还是超时。
现在我们开始使用动态规划
//为了减小时间复杂度,可以使用动态规划,时间复杂度变为O(n)
//在这种问题中,转移方程要记录(0,i]的最小值,前i个数据的最小值->前i-1个数据的最小值和当前值中的最小值,
//dp[i]=min(dp[i-1],prices[i])
//maxValue=(maxValue,prices[i]-dp[i])
public int maxProfitDP(int[] prices){
int maxProfit=0;
int[] minPriceCurrent=new int[prices.length];
minPriceCurrent[0]=prices[0]; //初始值
for(int i=1;i<prices.length;i++){
minPriceCurrent[i]=minPriceCurrent[i-1]>prices[i]?prices[i]:minPriceCurrent[i-1];
maxProfit=(maxProfit>prices[i]-minPriceCurrent[i])?maxProfit:prices[i]-minPriceCurrent[i]; //关系式
}
return maxProfit;
}