Use dynamic programming with buy/sell arrays for up to K transactions (or greedy approach if k >= n/2).
class Solution:
def maxProfit(self, k: int, prices: list[int]) -> int:
if not prices or k == 0:
return 0
n = len(prices)
if k >= n // 2:
profit = 0
for i in range(1, n):
if prices[i] > prices[i - 1]:
profit += prices[i] - prices[i - 1]
return profit
buy = [-float('inf')] * (k + 1)
sell = [0] * (k + 1)
for price in prices:
for j in range(1, k + 1):
buy[j] = max(buy[j], sell[j - 1] - price)
sell[j] = max(sell[j], buy[j] + price)
return sell[k]
class Solution {
public int maxProfit(int k, int[] prices) {
if (prices == null || prices.length == 0 || k == 0) return 0;
int n = prices.length;
if (k >= n / 2) {
int profit = 0;
for (int i = 1; i < n; i++) {
if (prices[i] > prices[i - 1]) {
profit += prices[i] - prices[i - 1];
}
}
return profit;
}
int[] buy = new int[k + 1];
int[] sell = new int[k + 1];
java.util.Arrays.fill(buy, Integer.MIN_VALUE / 2);
for (int price : prices) {
for (int j = 1; j <= k; j++) {
buy[j] = Math.max(buy[j], sell[j - 1] - price);
sell[j] = Math.max(sell[j], buy[j] + price);
}
}
return sell[k];
}
}