LeetCode Entry

3652. Best Time to Buy and Sell Stock using Strategy

18.12.2025 medium 2025 kotlin rust

Max Profit by modifying a sliding window sum

3652. Best Time to Buy and Sell Stock using Strategy medium blog post substack youtube

ab32cad1-a3a3-4a93-9514-929e96c0fb18 (1).webp

Join me on Telegram

https://t.me/leetcode_daily_unstoppable/1208

Problem TLDR

Max Profit by modifying a sliding window sum #medum

Intuition

Use two separate sliding window sums. The total max profit is sum + (modified window - original window)`

    // 0 1 2 i
    // 4 2 8
    //-1 0 1    k=2
    //   i

    // 9 2 9 5
    //-1 0 1 1    k=4
    //       i

Approach

  • use a single variable to hold sliding window sum

Complexity

  • Time complexity: \(O(n)\)

  • Space complexity: \(O(1)\)

Code

// 22ms
    fun maxProfit(p: IntArray, st: IntArray, k: Int): Long {
        var sm = 0L; var so = 0L; var diff = 0L
        return p.indices.sumOf { i ->
            sm += p[i] - if (i-k/2 >= 0) p[i-k/2] else 0
            so += st[i] * p[i] - if (i-k >= 0) st[i-k] * p[i-k] else 0
            if (i+1-k >= 0) diff = max(diff, sm - so)
            1L * st[i] * p[i]
        } + diff
    }
// 0ms
    pub fn max_profit(pr: Vec<i32>, st: Vec<i32>, k: i32) -> i64 {
        let (mut sm, mut so, mut diff, k) = (0,0,0,k as usize);
        pr.iter().zip(&st).enumerate().map(|(i, (&p, &s))|{
            sm += (p - if i >= k/2 { pr[i-k/2] } else { 0 }) as i64;
            so += (s*p - if i >= k { st[i-k] * pr[i-k] } else { 0 }) as i64;
            if i + 1 >= k { diff = diff.max(sm - so) }
            (s * p) as i64
        }).sum::<i64>() + diff
    }