Description
You are given an integer array prices where prices[i] is the price of a given stock on the ith day.
On each day, you may decide to buy and/or sell the stock. You can only hold at most one share of the stock at any time. However, you can buy it then immediately sell it on the same day.
Find and return the maximum profit you can achieve.
Examples
Example 1:
Input: prices = [7,1,5,3,6,4]
Output: 7
Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.
Total profit is 4 + 3 = 7.
Example 2:
Input: prices = [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
Total profit is 4.
Example 3:
Input: prices = [7,6,4,3,1]
Output: 0
Explanation: There is no way to make a positive profit, so we never buy the stock to achieve the maximum profit of 0.
Constraints:
1 <= prices.length <= 3 * 1 0 4 10^4 104
0 <= prices[i] <= 104
思路
有两种思路,第一种是比较好理解的
思路1
就是现在array中的每个元素都可能处于两种状态,一种是可以被卖出(canSoldState),一种是可以被买入(canBuyState),我们另上一个元素的两种状态值为preSoldState和preBuyState,那当前元素的两种状态分别有2更新可能
- canSoldState:维持preSoldState;在preBuyState的基础上购入Price
- canBuyState: 维持preBuyState;在preSoldState的基础上卖出Price
最后返回的是最后一个元素的canBuyState状态值
思路2
思路2和Best Time to Buy and Sell Stock比较接近,就是记录当前段落内的min,然后找到第距离min最近的极大值点,极大值-min
添加到收入上,极大值后的点作为min继续向下探索。
代码
思路1
class Solution {
public int maxProfit(int[] prices) {
int canSoldState = Integer.MIN_VALUE;
int canBuyState = 0;
for (int price: prices) {
int preSoldState = canSoldState;
int preBuyState = canBuyState;
canSoldState = Math.max(preSoldState, preBuyState - price);
canBuyState = Math.max(preBuyState, preSoldState + price);
}
return canBuyState;
}
}
思路2
class Solution {
public int maxProfit(int[] prices) {
int count = 0;
int currMax = 0;
int currMin = prices[0];
for (int price: prices) {
if (price - currMin < currMax) {
currMin = price;
count += currMax;
currMax = 0;
continue;
}
currMax = price - currMin;
}
count += currMax;
return count;
}
}