🎉 One-stop destination for all your technical interview Preparation 🎉
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.
class Solution {
private:
int maxProfitRec(vector<int>& prices, int i, bool canBuy)
{
if (i >= prices.size())
return 0;
if (canBuy) {
int notBuy = maxProfitRec(prices, i + 1, canBuy);
int buy = maxProfitRec(prices, i + 1, !canBuy) - prices[i];
return max(notBuy, buy);
} else {
int notSell = maxProfitRec(prices, i + 1, canBuy);
int sell = maxProfitRec(prices, i + 1, !canBuy) + prices[i];
return max(notSell, sell);
}
}
public:
int maxProfit(vector<int>& prices)
{
int n = prices.size();
if (n <= 1)
return 0;
return maxProfitRec(prices, 0, true);
}
};
class Solution {
private:
int maxProfitRec(vector<int>& prices, int i, bool canBuy, vector<vector<int>>& memo)
{
if (i >= prices.size())
return 0;
if (memo[i][canBuy] != -1)
return memo[i][canBuy];
if (canBuy) {
int notBuy = maxProfitRec(prices, i + 1, canBuy, memo);
int buy = maxProfitRec(prices, i + 1, !canBuy, memo) - prices[i];
return memo[i][canBuy] = max(notBuy, buy);
} else {
int notSell = maxProfitRec(prices, i + 1, canBuy, memo);
int sell = maxProfitRec(prices, i + 1, !canBuy, memo) + prices[i];
return memo[i][canBuy] = max(notSell, sell);
}
}
public:
int maxProfit(vector<int>& prices)
{
int n = prices.size();
if (n <= 1)
return 0;
vector<vector<int>> memo(n + 1, vector<int>(2, -1));
return maxProfitRec(prices, 0, true, memo);
}
};
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int n = prices.size();
int buy = 0, sell = 0;
int i = 0,profit = 0;
while (i < n - 1) {
// valley
while (i < n - 1 && prices[i] >= prices[i + 1])
i++;
buy = prices[i];
// peak
while (i < n - 1 && prices[i] < prices[i + 1])
i++;
sell = prices[i];
profit += sell - buy;
}
return profit;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int profit = 0;
int n = prices.size();
for (int i = 1; i < n; i++) {
if (prices[i - 1] < prices[i])
profit += prices[i] - prices[i - 1];
}
return profit;
}
};
[Recursive - DP | Explanation from (brute force-> dp -> greedy)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/discuss/1569135/Explanation-from-(brute-force-greater-dp-greater-greedy)) |