LeetCode in Kotlin

3652. Best Time to Buy and Sell Stock using Strategy

Medium

You are given two integer arrays prices and strategy, where:

You are also given an even integer k, and may perform at most one modification to strategy. A modification consists of:

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:

Solution

import kotlin.math.max

class Solution {
    fun maxProfit(p: IntArray, s: IntArray, k: Int): Long {
        val n = p.size
        val p1 = LongArray(n + 1)
        val p2 = LongArray(n + 1)
        for (i in 0..<n) {
            p1[i + 1] = p1[i] + s[i].toLong() * p[i]
            p2[i + 1] = p2[i] + p[i]
        }
        var max: Long = 0
        for (i in 0..n - k) {
            val m = i + k / 2
            val e = i + k
            val op = p1[e] - p1[i]
            val np = p2[e] - p2[m]
            max = max(max, np - op)
        }
        return p1[n] + max
    }
}