这道题,第一眼的思路就是利用两个嵌套的for循环,找出所有的组合中,利润最大的那个
public class maxProfit {
public int maxProfit(int[] prices) {
int n=prices.length;
int max=0;
int temp;
for(int i=0;i<n-1;i++) {
for(int j=i+1;j<n;j++) {
temp=prices[j]-prices[i];
if(temp>max) {
max=temp;
}
}
}
return max;
}
}
看得出来,运行确实能够通过,然而,速度也慢的不行,毕竟,双层for循环的嵌套时间复杂度是平方级别的。然后我查看了下别人的答案,发现别人仅用了一层for循环就解决了问题。思路如下:
令p[i]表示已经遍历过的数据中,检索出来的当前的最大利润,min表示已经遍历过的数据中,最小的值,则
p[i]=max(p[i-1],prices[i]-min)
这其实是动态规划的状态转移方程
代码如下:
public class maxProfit_2 {
public int maxProfit(int[] prices) {
int n=prices.length;
int maxprofit=0;
int min=prices[0];
for(int i=0;i<n;i++) {
if(min>prices[i]) min=prices[i];
if(prices[i]-min>maxprofit) maxprofit=prices[i]-min;
}
return maxprofit;
}
}
运行速度明显快了不少