解法1:暴力解法
双重循环,第一重遍历整个数组,第二重遍历第一重循环之后的所有数据,定义一个最大收益初始值为0,每次作差,如果收益比max大则赋值。
class Solution {
public int maxProfit(int[] prices) {
int len=prices.length;
if(len==0)return 0; //base case
int max=0;
//初始值为0的意义就是如果股票价格单调递减,那么直接返回0
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
int cur=prices[j]-prices[i];
if(cur>max){ //比较替换
max=cur;
}
}
}
return max;
}
}
时间复杂度o(n^2)
解法2:暴力之后肯定就是想着优化时间复杂度,将时间复杂度降为o(n),理逻辑试着一遍循环就求出结果。
遍历时记录前i天的最小值,如果当前比这个最小值还要小那么就直接赋值否则就计算当天和记录的最小值的差,再拿这个差与max比较,大则替换。这样就只要遍历一次啦
class Solution {
public int maxProfit(int[] prices) {
if(prices.length==0)return 0;//base case
int max=0;
int min=Integer.MAX_VALUE; //初始值设置为int上限
for(int i=0;i<prices.length;i++){
int cur;//避免两次进行计算
if(prices[i]<min){
min=prices[i];
}else if((cur=prices[i]-min)>max){//避免无用的计算
max=cur;
}
}
return max;
}
}