题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这种寻找最优解的问题,马上想到的就是动态规划和贪心。
我们创建一个dp的二维数组,用0表示手持现金,1表示手持股票。
初始化dp的值,然后遍历更新即可:
public int maxProfit(int[] prices) {
int [][]dp= new int[prices.length][2];
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<prices.length;i++)
{
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return dp[prices.length-1][0];
}
但是这样空间复杂度和时间都不算完美,还有更好的办法吗?
上面说道,除了动态规划,还有一个贪心也经常也被用来寻找最优解。
我们来仔细分析一下题目,其实我们就是要寻找多个[l,r]的区间,让这些区间的prices[r]-prices[l]相加为最大值。
在每个[l,r]区间中,都满足下面的式子:
prices[r]-prices[l]=prices[r]-prices[r-1]+prices[r-1]-prices[r-2]...+prices[l]-prices[l]
那么对于每一个我们要寻找的区间的prices[r]-prices[l]来说,就等于相邻元素之差之和。
我们来举个列子:
输入:1,2,3,4,5
根据我们上面的式子来说sum=2-1+3-2+4-3+5-4=4;
但实际上,我们更具买股票的最佳时机Ⅰ可以很轻易的得知实际过程应该是第一天买进,最后一天卖出sum=5-1=4;
讲到这里,大家应该理解了,上代码:
public int maxProfit(int[] prices) {
int sum=0;
for(int i=0;i+1<prices.length;i++)
{
sum=sum+Math.max(0,prices[i+1]-prices[i]);
}
return sum;
}
时间复杂度为O(n),空间复杂度为O(1)