这道题比我想象的简单,通过示例1可以发现,这个股票只能买卖一次,我以前写过一道题股票可以买卖多次比如示例1就可以1买5卖再3买6卖这样利润就是7,而这道题其实就是找一个小的数和它后面的大的数的差值,找出这个最大差值,如果用两遍循环肯定可以写出,但是数组的大小是10的5次方,两遍循环复杂度变成了10的10次方,肯定超时,所以最多用一次循环,以下是我的代码:
class Solution {
public int maxProfit(int[] prices) {
int n = prices.length;
if(n==0)return 0;
int[] dp = new int[n];
int min = prices[0];
int max = 0;
for(int i=1;i<n;i++){
dp[i] = prices[i] - min;
max=Math.max(max, dp[i]);
if(prices[i] < min) min=prices[i];
}
return max;
}
}
dp[i]表示我当天卖掉能挣的最多的钱,我遍历price数组,遍历到的元素是要卖掉的这一天,我只要用我当天的价格减前面的最小的价格就是我这天卖能挣的最多的钱,所以遍历的同时我维护一个min表示最小的价格,把这个差值放入dp[i]中,我用一个max表示dp数组中的最大值,每次dp数组更新的同时更新max,最后返回max就是最大的利润。需要注意的是测试用例中有一个长度为0的price数组,判断一下就好了。