Maximum Subarray: Kadane's Algorithm (Data-Backed Guide)

By DSA Prep Team · March 4, 2026 · 8 min read · Algorithms

Maximum Subarray is the #13 most asked LeetCode problem globally — and the most elegant introduction to Dynamic Programming as a technique.

Our analysis of 10,385 verified interview questions across 259 companies shows it appeared 66 times across 23 companies — including Google, Amazon, Meta, Microsoft, Goldman Sachs, Bloomberg, LinkedIn, DE Shaw, and J.P. Morgan.

Kadane's Algorithm solves this in O(n) time and O(1) space with a deceptively simple idea: at each position, decide whether to extend the current subarray or start fresh. The decision rule is just one line. Know it cold.

Table of Contents

The Data: 23 Companies Ask This

MetricValue
Total Interview Appearances66 verified mentions
Companies That Ask It23 companies
Global Rank#13 out of 10,385 questions
DifficultyMedium
Core PatternsArray, Dynamic Programming, Divide and Conquer

📌 Companies That Ask This Problem

Google, Amazon, Meta, Microsoft, Goldman Sachs, Bloomberg, LinkedIn, DE Shaw, J.P. Morgan, Morgan Stanley, Adobe, Apple, Atlassian, Autodesk, Barclays, Cisco, Cognizant, HashedIn, Huawei, IBM, Infosys, Intel, and 1 more.

Problem Statement

LeetCode #53 — Maximum Subarray

Given an integer array nums, find the subarray with the largest sum and return its sum.

Examples
Input:  nums = [-2,1,-3,4,-1,2,1,-5,4]   →  Output: 6  (subarray [4,-1,2,1])
Input:  nums = [1]                         →  Output: 1
Input:  nums = [5,4,-1,7,8]               →  Output: 23  (whole array)

The Core Intuition: Kadane's Algorithm

At each index i, you face a binary choice: extend the subarray ending at i-1 by including nums[i], or start a brand new subarray at i. The optimal choice is whichever gives the larger sum:

current_sum = max(nums[i], current_sum + nums[i])

If current_sum + nums[i] < nums[i], that means current_sum < 0 — a negative running sum only drags down the new element. So reset and start fresh. Track the maximum current_sum seen at any point.

💡 Kadane's in One Sentence

If the running sum goes negative, throw it away and restart from the current element — a negative prefix never helps maximize a subarray sum.

Visual Trace

Input: [-2, 1, -3, 4, -1, 2, 1, -5, 4]

inums[i]current_summax_sum
0-2-2-2
111 (reset)1
2-3-21
344 (reset)4
4-134
5255
6166
7-516
8456

Code in Python, Java & JavaScript

Python 3
def maxSubArray(nums: list[int]) -> int:
    current_sum = max_sum = nums[0]

    for num in nums[1:]:
        current_sum = max(num, current_sum + num)
        max_sum = max(max_sum, current_sum)

    return max_sum
Java
class Solution {
    public int maxSubArray(int[] nums) {
        int currentSum = nums[0], maxSum = nums[0];

        for (int i = 1; i < nums.length; i++) {
            currentSum = Math.max(nums[i], currentSum + nums[i]);
            maxSum = Math.max(maxSum, currentSum);
        }
        return maxSum;
    }
}
JavaScript
var maxSubArray = function(nums) {
    let currentSum = nums[0], maxSum = nums[0];

    for (let i = 1; i < nums.length; i++) {
        currentSum = Math.max(nums[i], currentSum + nums[i]);
        maxSum = Math.max(maxSum, currentSum);
    }
    return maxSum;
};

Complexity Analysis

📊 Complexity

Subarray DP Family

ProblemKey Idea
LC #53 Maximum SubarrayKadane's — reset when current_sum < 0
LC #152 Maximum Product SubarrayTrack both max and min (negatives flip sign)
LC #918 Maximum Circular Subarraymax(kadane, total_sum - min_subarray)
LC #560 Subarray Sum Equals KPrefix sum + hash map
LC #209 Minimum Size Subarray SumSliding window

How to Actually Remember This

✅ Your Spaced Repetition Schedule

  1. Today: Solve LC #53. Then LC #152 (Maximum Product Subarray) — same Kadane idea but track min too.
  2. Day 3: Solve LC #918 (Maximum Sum Circular Subarray).
  3. Day 7: Solve LC #560 (Subarray Sum Equals K) — prefix sum variant.
  4. Day 14: Implement Kadane's from scratch in under 3 minutes.

Tag on DSAPrep.dev under Dynamic Programming and Array.

Track on DSAPrep.dev →