题目描述:
- 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
- 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
解法一:暴力解法
- 两次for循环,每次循环为当前元素与其后面元素中大于当前元素的差值,即利润,设置temp记录最大利润
- 时间复杂度为O(n)、空间复杂度为O(1)
- 比较容易想,当然执行用时也是惨不忍睹…
public int maxProfit(int[] prices) {
int max=0;
int tempPrice = 0;
for(int i=0;i<prices.length-1;i++){
for(int j=i+1;j<prices.length;j++){
if(prices[i]<prices[j]){
tempPrice = prices[j]-prices[i];
}
if(tempPrice>max){
max=tempPrice;
}
}
}
return max;
}
解法二:双指针数组优化
- 遍历数组,依次求每个卖出时机的的最大差值,再从中取最大值
解释,参考一个老哥的刷题记录 - 一次遍历
- 时间复杂度为O(n)、空间复杂度为O(1)
public int maxProfit(int[] prices) {
int maxPrice = 0;
int minPrice = Integer.MAX_VALUE;
for(int i=0;i<prices.length;i++){
if(minPrice>prices[i]){
minPrice = prices[i];
}else if(prices[i]-minPrice>maxPrice){
maxPrice=prices[i]-minPrice;
}
}
return maxPrice;
}
解法三:动态规划
- 参考最长子序列53:
public int maxProfit(int[] prices) {
int dp=0;
int maxProfit = 0;
for(int i=1;i<prices.length;i++){
int num = prices[i]-prices[i-1];
dp = Math.max(num,num+dp);
maxProfit = Math.max(dp,maxProfit);
}
return maxProfit;
}