Pattern #33

Kadane’s Algorithm

Important interview questions, thinking patterns, maximum subarray sum, all-negative arrays, tracking range indices, Circular & Product variants, and Go rules.

Must Solve

10 core questions — solve these first.

  1. 1.Maximum Subarray
    medium
  2. 2.Maximum Sum Circular Subarray
    medium
  3. 3.Maximum Product Subarray
    medium
  4. 4.Best Time to Buy and Sell Stock
    easy
  5. 5.Maximum Sum Subarray with One Deletion
    medium
  6. 6.Maximum Absolute Sum of Any Subarray
    medium
  7. 7.Maximum Subarray Sum After One Operation
    medium
  8. 8.Maximum Sum of Two Non-Overlapping Subarrays
    medium
  9. 9.Maximum Subarray Min-Product
    medium
  10. 10.K-Concatenation Maximum Sum
    medium

Also Important

7 more questions worth practicing.

  1. 11.Maximum Alternating Subarray Sum
    medium
  2. 12.Maximum Subarray Sum with Length Constraint
    hard
  3. 13.Maximum Sum Rectangle in a 2D Matrix
    hard
  4. 14.Largest Sum Contiguous Subarray
    medium
  5. 15.Maximum Subarray with Start/End Index
    medium
  6. 16.Minimum Subarray Sum
    medium
  7. 17.Maximum Difference / Profit Variants
    easy

How to Think

  1. Need maximum sum of a continuous subarray?Kadane’s Algorithm
  2. Continuous part + max/min sum?Running best tracking
  3. Current running sum becomes harmful?Drop it! Start fresh at nums[i]
  4. Need maximum product instead of sum?Track BOTH max AND min (neg * neg = pos)

Go Kadane Code Template

Standard O(N) Time, O(1) Space Kadane in Go

func maxSubArray(nums []int) int {
    if len(nums) == 0 {
        return 0
    }

    // 1. Initialize with first element (safe for all-negative arrays!)
    curSum := nums[0]
    bestSum := nums[0]

    for i := 1; i < len(nums); i++ {
        // 2. Decide: Continue previous or start fresh at nums[i]
        if curSum+nums[i] > nums[i] {
            curSum = curSum + nums[i]
        } else {
            curSum = nums[i] // Drop bad negative past!
        }

        // 3. Track global maximum seen anywhere
        if curSum > bestSum {
            bestSum = curSum
        }
    }
    return bestSum
}

👉 Time: O(N) | Space: O(1)

All-Negative Array Handling ([-5, -2, -8])

If an array contains only negative numbers like [-5, -2, -8], the correct non-empty maximum subarray sum is -2 (NOT 0!).

❌ Zero Initialization Mistake

Setting cur = 0, best = 0 causes all-negative arrays to return 0 instead of the maximum single element (-2).

✅ First Element Initialization

Setting cur = nums[0], best = nums[0] guarantees non-empty subarray evaluation for negative inputs!

Tracking Actual Subarray [Start, End] Indices

When an interviewer asks for the actual continuous subarray bounds [start, end]:

func maxSubArrayWithIndices(nums []int) (int, int, int) {
    curSum, bestSum := nums[0], nums[0]
    start, end, tempStart := 0, 0, 0

    for i := 1; i < len(nums); i++ {
        if curSum + nums[i] > nums[i] {
            curSum += nums[i]
        } else {
            curSum = nums[i]
            tempStart = i // Restarting new candidate subarray!
        }

        if curSum > bestSum {
            bestSum = curSum
            start = tempStart
            end = i // Capture new peak boundaries!
        }
    }
    return bestSum, start, end
}

Circular & Product Subarray Variants

Maximum Sum Circular Subarray

Wrapped sum = TotalSum - minSubarraySum. Final answer = max(normalMax, totalSum - minSubarraySum) (unless all negative!).

Maximum Product Subarray

Track BOTH currentMax AND currentMin! A negative multiplier flips min $\leftrightarrow$ max. Swap min/max when encountering negative values.

Visual Memory Rule
cur = max(x, cur + x)
best = max(best, cur)

All negative array  → Initialize cur = nums[0], best = nums[0]
Track Range         → Set tempStart = i on restart, start = tempStart when best updates
Product Subarray    → Track BOTH max AND min

💡 Golden Rule: "If the previous sum makes the current position worse, throw it away and start again."

Common Interview Mistakes

1. Resetting to Zero

Initializing cur = 0, best = 0 fails on all-negative arrays. Always initialize with nums[0].

2. Returning Only Current

Returning curSum at the end instead of bestSum (the peak subarray sum may have ended earlier!).

3. Confusing Subarray with Subsequence

Kadane requires CONTINUOUS elements. In [5, -100, 6], picking [5, 6] is invalid!

4. Using Product Kadane Without Min

Tracking only currentMax for product subarrays loses track of negative pairs multiplying into large positive products!

Interview Rules

  1. 1. Maximum continuous sum? → Kadane’s Algorithm
  2. 2. Core formulacur = max(nums[i], cur + nums[i])
  3. 3. Global bestbest = max(best, cur)
  4. 4. All-negative array? → Initialize cur = nums[0], best = nums[0]
  5. 5. Need actual range? → Track tempStart, start, end
  6. 6. Circular maximum?max(normalMax, totalSum - minSubarraySum)
  7. 7. Maximum product? → Track BOTH currentMax AND currentMin
  8. 8. Overall ComplexityO(N) time, O(1) space

Small Rules

  1. Rule 1: Always initialize current and best with nums[0].
  2. Rule 2: At every item, decide between continuing previous sum vs starting fresh at nums[i].
  3. Rule 3: Always track global best separately from current ending sum.
  4. Rule 4: Kadane applies strictly to contiguous subarrays, not non-contiguous subsequences.
  5. Rule 5: Product Kadane requires maintaining min and max due to negative multiplication sign flips.

Production Thinking

Financial Profit/Loss StreakFind the strongest continuous profitable trading window

System Performance ChangesLocate the peak continuous performance improvement run in minute metrics

Financial Returns Gain PeriodIdentify maximum continuous gain duration across portfolio returns

A/B Testing Impact EvaluationIdentify highest continuous positive impact bucket sequence

Remember This

Kadane
→ Maximum continuous sum

At every position:

Continue
→ current + nums[i]

Restart
→ nums[i]

Take bigger

current → best ending HERE
best    → best ANYWHERE

Time  → O(n)
Space → O(1)

All negative → start from nums[0]

💡 Golden Rule: "If the previous sum makes the current position worse, throw it away and start again."