Bird
Raised Fist0
DSA Javaprogramming

Kadane's Algorithm Maximum Subarray in DSA Java

Choose your learning style10 modes available
Mental Model
Find the largest sum of any continuous part of the list by keeping track of the best sum ending at each position.
Analogy: Imagine walking along a path with ups and downs in height. You want to find the highest hill segment you can stand on continuously without jumping off.
Array: [ -2, 1, -3, 4, -1, 2, 1, -5, 4 ]
Indices:  0   1   2   3   4   5   6   7   8
Dry Run Walkthrough
Input: array: [-2, 1, -3, 4, -1, 2, 1, -5, 4]
Goal: Find the maximum sum of any continuous subarray
Step 1: Start with max_ending_here = max_so_far = -2 (first element)
max_ending_here = -2, max_so_far = -2
Why: Initialize with first element to start tracking sums
Step 2: At index 1 (value 1), max_ending_here = max(1, -2 + 1) = 1; max_so_far = max(-2, 1) = 1
max_ending_here = 1, max_so_far = 1
Why: Decide to start new subarray at 1 because it is better than continuing previous sum
Step 3: At index 2 (value -3), max_ending_here = max(-3, 1 + -3) = -2; max_so_far = max(1, -2) = 1
max_ending_here = -2, max_so_far = 1
Why: Continuing subarray reduces sum, but max_so_far stays 1
Step 4: At index 3 (value 4), max_ending_here = max(4, -2 + 4) = 4; max_so_far = max(1, 4) = 4
max_ending_here = 4, max_so_far = 4
Why: Start new subarray at 4 since it is better than continuing negative sum
Step 5: At index 4 (value -1), max_ending_here = max(-1, 4 + -1) = 3; max_so_far = max(4, 3) = 4
max_ending_here = 3, max_so_far = 4
Why: Continue subarray, sum decreases but max_so_far stays
Step 6: At index 5 (value 2), max_ending_here = max(2, 3 + 2) = 5; max_so_far = max(4, 5) = 5
max_ending_here = 5, max_so_far = 5
Why: Continuing subarray increases sum, update max_so_far
Step 7: At index 6 (value 1), max_ending_here = max(1, 5 + 1) = 6; max_so_far = max(5, 6) = 6
max_ending_here = 6, max_so_far = 6
Why: Continuing subarray increases sum, update max_so_far
Step 8: At index 7 (value -5), max_ending_here = max(-5, 6 + -5) = 1; max_so_far = max(6, 1) = 6
max_ending_here = 1, max_so_far = 6
Why: Sum decreases but max_so_far stays
Step 9: At index 8 (value 4), max_ending_here = max(4, 1 + 4) = 5; max_so_far = max(6, 5) = 6
max_ending_here = 5, max_so_far = 6
Why: Sum increases but max_so_far stays
Result:
max_so_far = 6 (subarray [4, -1, 2, 1])
Annotated Code
DSA Java
public class KadaneAlgorithm {

    public static int maxSubArray(int[] nums) {
        int maxEndingHere = nums[0];
        int maxSoFar = nums[0];

        for (int i = 1; i < nums.length; i++) {
            maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
            maxSoFar = Math.max(maxSoFar, maxEndingHere);
        }

        return maxSoFar;
    }

    public static void main(String[] args) {
        int[] nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
        int maxSum = maxSubArray(nums);
        System.out.println(maxSum);
    }
}
maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
Choose to start new subarray at current element or continue previous subarray
maxSoFar = Math.max(maxSoFar, maxEndingHere);
Update max sum found so far if current subarray sum is greater
OutputSuccess
6
Complexity Analysis
Time: O(n) because we scan the array once, updating sums at each element
Space: O(1) because we only use a few variables, no extra array
vs Alternative: Naive approach checks all subarrays with nested loops O(n^2), Kadane's is much faster with O(n)
Edge Cases
Array with all negative numbers
Algorithm returns the largest (least negative) single element
DSA Java
int maxEndingHere = nums[0];
Array with single element
Returns that element as max sum
DSA Java
int maxEndingHere = nums[0];
Array with all positive numbers
Returns sum of entire array
DSA Java
maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
When to Use This Pattern
When asked to find the maximum sum of a continuous subarray, reach for Kadane's algorithm because it efficiently tracks the best sum ending at each position.
Common Mistakes
Mistake: Resetting maxSoFar inside the loop incorrectly
Fix: Only update maxSoFar if maxEndingHere is greater, do not reset it to zero
Mistake: Starting maxEndingHere from zero instead of first element
Fix: Initialize maxEndingHere and maxSoFar with the first element to handle negative values correctly
Summary
Finds the maximum sum of any continuous subarray in a list.
Use when you need the largest sum of consecutive elements efficiently.
Keep track of the best sum ending at each position to avoid checking all subarrays.

Practice

(1/5)
1. What does Kadane's Algorithm primarily help to find in an array of integers?
easy
A. The minimum element in the array
B. The number of positive elements
C. The total sum of all elements
D. The maximum sum of a contiguous subarray

Solution

  1. Step 1: Understand the problem Kadane's Algorithm solves

    Kadane's Algorithm is designed to find the maximum sum of any contiguous subarray within a given array.
  2. Step 2: Differentiate from other array operations

    It does not find minimum elements, total sum, or count positives, but specifically the maximum sum of a continuous segment.
  3. Final Answer:

    The maximum sum of a contiguous subarray -> Option D
  4. Quick Check:

    Maximum subarray sum = maximum sum of contiguous elements [OK]
Hint: Kadane's finds max sum of continuous elements fast [OK]
Common Mistakes:
  • Confusing maximum subarray sum with total array sum
  • Thinking it finds minimum or count of elements
  • Assuming it works on non-contiguous elements
2. Which of the following is the correct initialization for Kadane's Algorithm variables in Java?
easy
A. int maxSoFar = 0, maxEndingHere = 0;
B. int maxSoFar = 0, maxEndingHere = Integer.MAX_VALUE;
C. int maxSoFar = Integer.MIN_VALUE, maxEndingHere = 0;
D. int maxSoFar = Integer.MAX_VALUE, maxEndingHere = Integer.MIN_VALUE;

Solution

  1. Step 1: Identify correct initial values for Kadane's variables

    maxSoFar should start at the smallest integer to handle all negative arrays; maxEndingHere starts at 0 to accumulate sums.
  2. Step 2: Check each option's initialization

    int maxSoFar = Integer.MIN_VALUE, maxEndingHere = 0; correctly sets maxSoFar to Integer.MIN_VALUE and maxEndingHere to 0, which is standard practice.
  3. Final Answer:

    int maxSoFar = Integer.MIN_VALUE, maxEndingHere = 0; -> Option C
  4. Quick Check:

    Initialize maxSoFar low, maxEndingHere zero [OK]
Hint: Start maxSoFar at smallest int, maxEndingHere at zero [OK]
Common Mistakes:
  • Initializing maxSoFar to 0 causes errors with all negative arrays
  • Swapping maxSoFar and maxEndingHere initial values
  • Using Integer.MAX_VALUE incorrectly
3. What is the output of the following Java code using Kadane's Algorithm?
int[] arr = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int maxSoFar = Integer.MIN_VALUE, maxEndingHere = 0;
for (int num : arr) {
    maxEndingHere += num;
    if (maxSoFar < maxEndingHere) maxSoFar = maxEndingHere;
    if (maxEndingHere < 0) maxEndingHere = 0;
}
System.out.println(maxSoFar);
medium
A. 6
B. 7
C. 5
D. 4

Solution

  1. Step 1: Trace the loop and update sums

    Iterate through arr, updating maxEndingHere and maxSoFar:
    - Start: maxSoFar = -∞, maxEndingHere = 0
    - Add -2: maxEndingHere = -2 (reset to 0)
    - Add 1: maxEndingHere = 1, maxSoFar = 1
    - Add -3: maxEndingHere = -2 (reset to 0)
    - Add 4: maxEndingHere = 4, maxSoFar = 4
    - Add -1: maxEndingHere = 3
    - Add 2: maxEndingHere = 5, maxSoFar = 5
    - Add 1: maxEndingHere = 6, maxSoFar = 6
    - Add -5: maxEndingHere = 1
    - Add 4: maxEndingHere = 5
  2. Step 2: Identify maximum sum found

    The maximum sum recorded is 6, but check carefully:
    At step adding 1 after 2, maxEndingHere = 6, maxSoFar = 6
    At last step, maxEndingHere = 5, maxSoFar remains 6
    Wait, re-check:
    Actually, after adding 1 (step 7), maxEndingHere = 6
    Then adding -5 (step 8), maxEndingHere = 1
    Then adding 4 (step 9), maxEndingHere = 5
    So maxSoFar = 6
  3. Correction:

    Re-examining the sums, the maximum subarray is [4, -1, 2, 1] which sums to 6, but the subarray [4, -1, 2, 1] sums to 6, so 6 is correct.
    However, the standard Kadane's algorithm for this array returns 6, but the known maximum subarray sum is 6.
    But the options include 7, which is incorrect.
    Therefore, the original answer C (6) is correct.
  4. Final Answer:

    6 -> Option A
  5. Quick Check:

    Max subarray sum = 6 [OK]
Hint: Add and reset sum; track max sum found [OK]
Common Mistakes:
  • Forgetting to reset maxEndingHere when negative
  • Miscounting sums during iteration
  • Confusing maxSoFar with maxEndingHere
4. Identify the bug in this Kadane's Algorithm Java code snippet:
int maxSoFar = 0, maxEndingHere = 0;
for (int num : arr) {
    maxEndingHere = Math.max(num, maxEndingHere + num);
    maxSoFar = Math.max(maxSoFar, maxEndingHere);
}
System.out.println(maxSoFar);
medium
A. maxEndingHere should be initialized to Integer.MAX_VALUE
B. maxSoFar should start at Integer.MIN_VALUE, not 0
C. The loop should start from index 1, not 0
D. Using Math.max is incorrect for Kadane's Algorithm

Solution

  1. Step 1: Analyze initialization of maxSoFar

    Starting maxSoFar at 0 causes incorrect results if all numbers are negative, as maxSoFar will never update to a negative max subarray.
  2. Step 2: Correct initialization for negative arrays

    maxSoFar should be initialized to Integer.MIN_VALUE to correctly track maximum sums even if all are negative.
  3. Final Answer:

    maxSoFar should start at Integer.MIN_VALUE, not 0 -> Option B
  4. Quick Check:

    Initialize maxSoFar low to handle negatives [OK]
Hint: Initialize maxSoFar to smallest int to handle negatives [OK]
Common Mistakes:
  • Initializing maxSoFar to 0 causes wrong max for negative arrays
  • Misunderstanding Math.max usage in Kadane's
  • Incorrect loop indexing assumptions
5. Given an array int[] arr = {-1, -2, -3, -4}, what will Kadane's Algorithm return as the maximum subarray sum if initialized with maxSoFar = Integer.MIN_VALUE and maxEndingHere = 0?
hard
A. -1
B. 0
C. -10
D. 4

Solution

  1. Step 1: Trace Kadane's Algorithm on all negative array

    maxEndingHere resets to 0 when negative, but maxSoFar tracks max subarray sum:
    - Add -1: maxEndingHere = -1 (reset to 0), maxSoFar = -1
    - Add -2: maxEndingHere = -2 (reset to 0), maxSoFar = -1
    - Add -3: maxEndingHere = -3 (reset to 0), maxSoFar = -1
    - Add -4: maxEndingHere = -4 (reset to 0), maxSoFar = -1
  2. Step 2: Identify maximum subarray sum

    The maximum subarray sum is -1, the largest single element in the array.
  3. Final Answer:

    -1 -> Option A
  4. Quick Check:

    Max subarray sum in negatives = max single element [OK]
Hint: Max sum in all negatives is largest single element [OK]
Common Mistakes:
  • Assuming max sum is 0 due to resets
  • Summing all negatives incorrectly
  • Ignoring initialization of maxSoFar
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard