Welcome to Subscribe On Youtube
3652. Best Time to Buy and Sell Stock using Strategy
Description
You are given two integer arrays prices
and strategy
, where:
prices[i]
is the price of a given stock on theith
day.strategy[i]
represents a trading action on theith
day, where:-1
indicates buying one unit of the stock.0
indicates holding the stock.1
indicates selling one unit of the stock.
You are also given an even integer k
, and may perform at most one modification to strategy
. A modification consists of:
- Selecting exactly
k
consecutive elements instrategy
. - Set the first
k / 2
elements to0
(hold). - Set the last
k / 2
elements to1
(sell).
The profit is defined as the sum of strategy[i] * prices[i]
across all days.
Return the maximum possible profit you can achieve.
Note: There are no constraints on budget or stock ownership, so all buy and sell operations are feasible regardless of past actions.
Example 1:
Input: prices = [4,2,8], strategy = [-1,0,1], k = 2
Output: 10
Explanation:
Modification | Strategy | Profit Calculation | Profit |
---|---|---|---|
Original | [-1, 0, 1] | (-1 × 4) + (0 × 2) + (1 × 8) = -4 + 0 + 8 | 4 |
Modify [0, 1] | [0, 1, 1] | (0 × 4) + (1 × 2) + (1 × 8) = 0 + 2 + 8 | 10 |
Modify [1, 2] | [-1, 0, 1] | (-1 × 4) + (0 × 2) + (1 × 8) = -4 + 0 + 8 | 4 |
Thus, the maximum possible profit is 10, which is achieved by modifying the subarray [0, 1]
.
Example 2:
Input: prices = [5,4,3], strategy = [1,1,0], k = 2
Output: 9
Explanation:
Modification | Strategy | Profit Calculation | Profit |
---|---|---|---|
Original | [1, 1, 0] | (1 × 5) + (1 × 4) + (0 × 3) = 5 + 4 + 0 | 9 |
Modify [0, 1] | [0, 1, 0] | (0 × 5) + (1 × 4) + (0 × 3) = 0 + 4 + 0 | 4 |
Modify [1, 2] | [1, 0, 1] | (1 × 5) + (0 × 4) + (1 × 3) = 5 + 0 + 3 | 8 |
Thus, the maximum possible profit is 9, which is achieved without any modification.
Constraints:
2 <= prices.length == strategy.length <= 105
1 <= prices[i] <= 105
-1 <= strategy[i] <= 1
2 <= k <= prices.length
k
is even
Solutions
Solution 1: Prefix Sum + Enumeration
We use an array $\textit{s}$ to represent the prefix sum, where $\textit{s}[i]$ is the total profit for the first $i$ days, i.e., $\textit{s}[i] = \sum_{j=0}^{i-1} \textit{prices}[j] \times \textit{strategy}[j]$. We also use an array $\textit{t}$ to represent the prefix sum of stock prices, where $\textit{t}[i] = \sum_{j=0}^{i-1} \textit{prices}[j]$.
Initially, the maximum profit is $\textit{s}[n]$. We enumerate the right endpoint $i$ of the subarray to be modified, with the left endpoint being $i-k$. After modification, the first $k/2$ days of the subarray have strategy $0$, and the last $k/2$ days have strategy $1$, so the profit change is:
\[\Delta = -(\textit{s}[i] - \textit{s}[i-k]) + (\textit{t}[i] - \textit{t}[i-k/2])\]Therefore, we can update the maximum profit by enumerating all possible $i$.
The time complexity is $O(n)$, and the space complexity is $O(n)$, where $n$ is the length of the array.
-
class Solution { public long maxProfit(int[] prices, int[] strategy, int k) { int n = prices.length; long[] s = new long[n + 1]; long[] t = new long[n + 1]; for (int i = 1; i <= n; i++) { int a = prices[i - 1]; int b = strategy[i - 1]; s[i] = s[i - 1] + a * b; t[i] = t[i - 1] + a; } long ans = s[n]; for (int i = k; i <= n; i++) { ans = Math.max(ans, s[n] - (s[i] - s[i - k]) + (t[i] - t[i - k / 2])); } return ans; } }
-
class Solution { public: long long maxProfit(vector<int>& prices, vector<int>& strategy, int k) { int n = prices.size(); vector<long long> s(n + 1), t(n + 1); for (int i = 1; i <= n; i++) { int a = prices[i - 1]; int b = strategy[i - 1]; s[i] = s[i - 1] + a * b; t[i] = t[i - 1] + a; } long long ans = s[n]; for (int i = k; i <= n; i++) { ans = max(ans, s[n] - (s[i] - s[i - k]) + (t[i] - t[i - k / 2])); } return ans; } };
-
class Solution: def maxProfit(self, prices: List[int], strategy: List[int], k: int) -> int: n = len(prices) s = [0] * (n + 1) t = [0] * (n + 1) for i, (a, b) in enumerate(zip(prices, strategy), 1): s[i] = s[i - 1] + a * b t[i] = t[i - 1] + a ans = s[n] for i in range(k, n + 1): ans = max(ans, s[n] - (s[i] - s[i - k]) + t[i] - t[i - k // 2]) return ans
-
func maxProfit(prices []int, strategy []int, k int) int64 { n := len(prices) s := make([]int64, n+1) t := make([]int64, n+1) for i := 1; i <= n; i++ { a := prices[i-1] b := strategy[i-1] s[i] = s[i-1] + int64(a*b) t[i] = t[i-1] + int64(a) } ans := s[n] for i := k; i <= n; i++ { ans = max(ans, s[n]-(s[i]-s[i-k])+(t[i]-t[i-k/2])) } return ans }
-
function maxProfit(prices: number[], strategy: number[], k: number): number { const n = prices.length; const s: number[] = Array(n + 1).fill(0); const t: number[] = Array(n + 1).fill(0); for (let i = 1; i <= n; i++) { const a = prices[i - 1]; const b = strategy[i - 1]; s[i] = s[i - 1] + a * b; t[i] = t[i - 1] + a; } let ans = s[n]; for (let i = k; i <= n; i++) { const val = s[n] - (s[i] - s[i - k]) + (t[i] - t[i - Math.floor(k / 2)]); ans = Math.max(ans, val); } return ans; }