You are given an array prices where prices[i] is the price of a given stock on the ith day.
You want to maximize your profit by choosing a single day to buy one stock and choosing a different day in the future to sell that stock.
Return the maximum profit you can achieve from this transaction. If you cannot achieve any profit, return 0.
Example 1:
Input: prices = [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Note that buying on day 2 and selling on day 1 is not allowed because you must buy before you sell.
单调栈:
1、如果为空栈或入栈元素大于栈顶元素则入栈
2、如果入栈元素小于等于入栈元素,则弹出栈顶元素,直到栈顶元素小于入栈元素
class Solution { public: int maxProfit(vector<int>& prices) { int ans = 0; vector<int> St; prices.emplace_back(-1); \\ 哨兵👨✈️ for (int i = 0; i < prices.size(); ++ i){ while (!St.empty() && St.back() > prices[i]){ \\ 维护单调栈 ans = std::max(ans, St.back() - St.front()); \\ 维护最大值 St.pop_back(); } St.emplace_back(prices[i]); } return ans; } };
利用动态规划算法:
dp[i]=max(dp[i−1],prices[i]−minprice)
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n == 0) return 0; // 边界条件
int minprice = prices[0];
vector<int> dp (n, 0);
for (int i = 1; i < n; i++){
minprice = min(minprice, prices[i]);
dp[i] = max(dp[i - 1], prices[i] - minprice);
}
return dp[n - 1];
}
};
我的代码:
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int flag = 0;
int Max = 0;
for(int i = 1;i<prices.size();i++)
{
if(prices[i]<prices[i-1]&&prices[flag] > prices[i])
flag = i; //找最小
Max = max(Max,prices[i] - prices[flag]);
}
return Max;
}
};