Talentd
FleetCode
Make and follow sheets.Sign in

Sum of Imbalance Numbers of All Subarrays solution and explanation

HardArrayHash TableOrdered Set5 min read41.9% acceptanceUpdated 9 Apr 2026
2 Approaches | 2763. Sum of Imbalance Numbers of All Subarrays | Leetcode Weekly Contest 352codingMohan · 25:22 · 1K viewsWatch on YouTube
9 more videos on this problem
  1. 2 Approaches | 2763. Sum of Imbalance Numbers of All Subarrays | Leetcode Weekly Contest 352codingMohan · 25:22 · 1K views
  2. Sum of Imbalance Numbers of All Subarrays | Leetcode 2763 | Contest 352Tech Courses · 11:04 · 701 views
  3. 6894. Sum of Imbalance Numbers of All Subarrays || Leetcode Weekly contest || HindiAshish Kumar · 8:43 · 604 views
  4. 【每日一题】LeetCode 2763. Sum of Imbalance Numbers of All SubarraysHuifeng Guan · 44:12 · 484 views
  5. 2763. Sum of Imbalance Numbers of All Subarrays (Leetcode Hard)Programming Live with Larry · 14:54 · 474 views
  6. Leetcode Weekly 352: 2763. Sum of Imbalance Numbers of All Subarrays (O(n^2))Divyansh Tyagi · 21:29 · 259 views
  7. 6894. Sum of Imbalance Numbers of All Subarrays | Leetcode Hardquebeat · 29:42 · 183 views
  8. Sum of Imbalance of All Subarrays - LeetCode 2763 - PythonAlpha-Code · 21:54 · 165 views
  9. Sum of Imbalance Numbers of All Subarrays (Leetcode Weekly 352)Soumya Bhattacharjee · 8:41 · 96 views
  10. Leetcode Weekly Contest 352 || Sum of Imbalance Numbers of All Subarrys | Hard (Using Set very Easy)Code With Singh · 20:04 · 381 views

The problem

The imbalance number of a 0-indexed integer array arr of length n is defined as the number of indices in sarr = sorted(arr) such that:

  • 0 <= i < n - 1, and
  • sarr[i+1] - sarr[i] > 1

Here, sorted(arr) is the function that returns the sorted version of arr.

Given a 0-indexed integer array nums, return the sum of imbalance numbers of all its subarrays.

A subarray is a contiguous non-empty sequence of elements within an array.

Example 1:

Input: nums = [2,3,1,4]
Output: 3
Explanation: There are 3 subarrays with non-zero imbalance numbers:
- Subarray [3, 1] with an imbalance number of 1.
- Subarray [3, 1, 4] with an imbalance number of 1.
- Subarray [1, 4] with an imbalance number of 1.
The imbalance number of all other subarrays is 0. Hence, the sum of imbalance numbers of all the subarrays of nums is 3. 

Example 2:

Input: nums = [1,3,3,3,5]
Output: 8
Explanation: There are 7 subarrays with non-zero imbalance numbers:
- Subarray [1, 3] with an imbalance number of 1.
- Subarray [1, 3, 3] with an imbalance number of 1.
- Subarray [1, 3, 3, 3] with an imbalance number of 1.
- Subarray [1, 3, 3, 3, 5] with an imbalance number of 2. 
- Subarray [3, 3, 3, 5] with an imbalance number of 1. 
- Subarray [3, 3, 5] with an imbalance number of 1.
- Subarray [3, 5] with an imbalance number of 1.
The imbalance number of all other subarrays is 0. Hence, the sum of imbalance numbers of all the subarrays of nums is 8. 

Constraints:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= nums.length

Approach overview

Problem Overview: Given an integer array, every subarray has an imbalance number defined as the count of gaps greater than 1 between adjacent elements after sorting that subarray. The task is to compute the total imbalance across all possible subarrays.

Approach 1: Brute Force with Ordered Set (O(n2 log n) time, O(n) space)

Enumerate every subarray by fixing a start index and expanding the end index. Maintain the elements of the current subarray inside an ordered structure such as a balanced tree or sorted container. Each insertion finds the predecessor and successor of the new value and checks whether a new gap is introduced or removed. The imbalance count is updated incrementally instead of recomputing the whole sorted array each time. Ordered lookups and insertions cost O(log n), giving an overall complexity of O(n^2 log n). This approach directly models the definition and is useful for understanding how gaps appear between consecutive values.

Key operations include ordered insertion, predecessor lookup, and successor lookup. Data structures commonly used are TreeSet, SortedList, or similar ordered containers from Ordered Set implementations.

Approach 2: Dynamic Imbalance Adjustment (O(n2) time, O(n) space)

The optimized approach avoids maintaining a fully ordered structure. For each starting index, expand the subarray to the right and track which values have appeared using a boolean array or hash structure. When inserting a new number x, check whether x-1 and x+1 already exist in the current subarray. If neither exists, a new gap is created so the imbalance increases by one. If both neighbors exist, two previous gaps merge into one so the imbalance decreases by one. Otherwise the imbalance remains unchanged.

This constant-time adjustment eliminates the log n overhead from ordered structures. The algorithm iterates over all starting indices and dynamically updates the imbalance while expanding the subarray, resulting in O(n^2) total work and O(n) auxiliary space. The method relies heavily on fast membership checks using Hash Table or boolean arrays and sequential scanning of the Array.

Recommended for interviews: Start by explaining the brute force enumeration with an ordered set to demonstrate understanding of the imbalance definition and how sorted neighbors determine gaps. Then move to the dynamic adjustment technique, which interviewers typically expect. It reduces the per‑insertion cost to constant time and shows strong reasoning about how local neighbor relationships affect the imbalance metric.

Approach 1: Brute Force Approach

This approach involves iterating through all possible subarrays of the given array, sorting each subarray, and calculating the imbalance number.

For each subarray, sort it, and then count the pairs of elements such that the difference between them is greater than 1. Sum these counts for all subarrays to get the total imbalance number.

def sum_of_imbalance_numbers(nums):
    total_imbalance = 0
    n = len(nums)
    for i in range(n):
        for j in range(i, n):
            subarray = sorted(nums[i:j+1])
            imbalance = sum(1 for k in range(len(subarray)-1) if subarray[k+1] - subarray[k] > 1)
            total_imbalance += imbalance
    return total_imbalance

print(sum_of_imbalance_numbers([2, 3, 1, 4]))
import java.util.Arrays;

public class ImbalanceSum {
    public static int sumOfImbalanceNumbers(int[] nums) {
        int totalImbalance = 0;
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                int[] subArray = Arrays.copyOfRange(nums, i, j + 1);
                Arrays.sort(subArray);
                int imbalance = 0;
                for (int k = 0; k < subArray.length - 1; k++) {
                    if (subArray[k + 1] - subArray[k] > 1) {
                        imbalance++;
                    }
                }
                totalImbalance += imbalance;
            }
        }
        return totalImbalance;
    }

    public static void main(String[] args) {
        int[] nums = {2, 3, 1, 4};
        System.out.println(sumOfImbalanceNumbers(nums));
    }
}
#include <iostream>
#include <vector>
#include <algorithm>

int sumOfImbalanceNumbers(const std::vector<int>& nums) {
    int totalImbalance = 0;
    int n = nums.size();
    for (int i = 0; i < n; ++i) {
        for (int j = i; j < n; ++j) {
            std::vector<int> subArray(nums.begin() + i, nums.begin() + j + 1);
            std::sort(subArray.begin(), subArray.end());
            int imbalance = 0;
            for (int k = 0; k < subArray.size() - 1; ++k) {
                if (subArray[k+1] - subArray[k] > 1) 
                    imbalance++;
            }
            totalImbalance += imbalance;
        }
    }
    return totalImbalance;
}

int main() {
    std::vector<int> nums = {2, 3, 1, 4};
    std::cout << sumOfImbalanceNumbers(nums) << std::endl;
    return 0;
}
function sumOfImbalanceNumbers(nums) {
    let totalImbalance = 0;
    const n = nums.length;
    for (let i = 0; i < n; i++) {
        for (let j = i; j < n; j++) {
            const subArray = nums.slice(i, j + 1).sort((a, b) => a - b);
            let imbalance = 0;
            for (let k = 0; k < subArray.length - 1; k++) {
                if (subArray[k + 1] - subArray[k] > 1) {
                    imbalance++;
                }
            }
            totalImbalance += imbalance;
        }
    }
    return totalImbalance;
}

console.log(sumOfImbalanceNumbers([2, 3, 1, 4]));
#include <stdio.h>
#include <stdlib.h>

int compare(const void* a, const void* b){
    return (*(int*)a - *(int*)b);
}

int sumOfImbalanceNumbers(int* nums, int numsSize){
    int totalImbalance = 0;
    for (int i = 0; i < numsSize; i++) {
        for (int j = i; j < numsSize; j++) {
            int subArraySize = j - i + 1;
            int* subArray = (int*)malloc(subArraySize * sizeof(int));
            for (int k = i; k <= j; k++)
                subArray[k-i] = nums[k];
            qsort(subArray, subArraySize, sizeof(int), compare);
            int imbalance = 0;
            for (int k = 0; k < subArraySize - 1; k++) {
                if (subArray[k+1] - subArray[k] > 1) 
                    imbalance++;
            }
            totalImbalance += imbalance;
            free(subArray);
        }
    }
    return totalImbalance;
}

int main() {
    int nums[] = {2, 3, 1, 4};
    int numsSize = sizeof(nums) / sizeof(nums[0]);
    printf("%d\n", sumOfImbalanceNumbers(nums, numsSize));
    return 0;
}
using System;
using System.Linq;

public class ImbalanceSum {
    public static int SumOfImbalanceNumbers(int[] nums) {
        int totalImbalance = 0;
        int n = nums.Length;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                var subArray = nums.Skip(i).Take(j - i + 1).OrderBy(x => x).ToArray();
                int imbalance = 0;
                for (int k = 0; k < subArray.Length - 1; k++) {
                    if (subArray[k + 1] - subArray[k] > 1) {
                        imbalance++;
                    }
                }
                totalImbalance += imbalance;
            }
        }
        return totalImbalance;
    }

    public static void Main() {
        int[] nums = {2, 3, 1, 4};
        Console.WriteLine(SumOfImbalanceNumbers(nums));
    }
}

In Python, a simple two-loop is used to generate subarrays, sorted via sorted(), and the imbalance number is calculated using a comprehension expression.

Complexity

Time Complexity: O(N^3 log N) because each subarray requires a sort operation.

Space Complexity: O(N) due to the space needed for sorting.

Try this approach in the editor

Approach 2: Optimized Approach with Dynamic Adjustment

The optimized approach avoids recalculating imbalance for overlapping parts of subarrays. We adjust the imbalance by adding or removing elements dynamically from a running subarray.

To achieve this, rely on maintaining counts of each element, assisting in quickly determining when the imbalance conditions are met as the subarray boundaries shift.

def sum_of_imbalance_numbers(nums):
    total_imbalance = 0
    n = len(nums)
    for start in range(n):
        count = [0] * (n+1)
        imbalance = 0
        for end in range(start, n):
            if nums[end] > 1 and count[nums[end] - 1] > 0:
                imbalance -= 1
            if nums[end] < n and count[nums[end] + 1] > 0:
                imbalance -= 1
            count[nums[end]] += 1
            if nums[end] > 1 and count[nums[end] - 1] == 0:
                imbalance += 1
            if nums[end] < n and count[nums[end] + 1] == 0:
                imbalance += 1
            total_imbalance += imbalance
    return total_imbalance

print(sum_of_imbalance_numbers([2, 3, 1, 4]))
public class ImbalanceSum {
    public static int sumOfImbalanceNumbers(int[] nums) {
        int totalImbalance = 0;
        int n = nums.length;
        for (int start = 0; start < n; start++) {
            int[] count = new int[n+1];
            int imbalance = 0;
            for (int end = start; end < n; end++) {
                if (nums[end] > 1 && count[nums[end] - 1] > 0) {
                    imbalance--;
                }
                if (nums[end] < n && count[nums[end] + 1] > 0) {
                    imbalance--;
                }
                count[nums[end]]++;
                if (nums[end] > 1 && count[nums[end] - 1] == 0) {
                    imbalance++;
                }
                if (nums[end] < n && count[nums[end] + 1] == 0) {
                    imbalance++;
                }
                totalImbalance += imbalance;
            }
        }
        return totalImbalance;
    }

    public static void main(String[] args){
        int[] nums = {2, 3, 1, 4};
        System.out.println(sumOfImbalanceNumbers(nums));
    }
}
#include <iostream>
#include <vector>

int sumOfImbalanceNumbers(const std::vector<int>& nums) {
    int totalImbalance = 0;
    int n = nums.size();
    for (int start = 0; start < n; ++start) {
        int count[1001] = {0};
        int imbalance = 0;
        for (int end = start; end < n; ++end) {
            if (nums[end] - 1 >= 1 && count[nums[end] - 1] > 0) {
                --imbalance;
            }
            if (nums[end] + 1 <= n && count[nums[end] + 1] > 0) {
                --imbalance;
            }
            ++count[nums[end]];
            if (nums[end] - 1 >= 1 && count[nums[end] - 1] == 0) {
                ++imbalance;
            }
            if (nums[end] + 1 <= n && count[nums[end] + 1] == 0) {
                ++imbalance;
            }
            totalImbalance += imbalance;
        }
    }
    return totalImbalance;
}

int main() {
    std::vector<int> nums = {2, 3, 1, 4};
    std::cout << sumOfImbalanceNumbers(nums) << std::endl;
    return 0;
}
function sumOfImbalanceNumbers(nums) {
    let totalImbalance = 0;
    const n = nums.length;
    for (let start = 0; start < n; start++) {
        const count = Array(n + 1).fill(0);
        let imbalance = 0;
        for (let end = start; end < n; end++) {
            if (nums[end] > 1 && count[nums[end] - 1] > 0) {
                imbalance--;
            }
            if (nums[end] < n && count[nums[end] + 1] > 0) {
                imbalance--;
            }
            count[nums[end]]++;
            if (nums[end] > 1 && count[nums[end] - 1] === 0) {
                imbalance++;
            }
            if (nums[end] < n && count[nums[end] + 1] === 0) {
                imbalance++;
            }
            totalImbalance += imbalance;
        }
    }
    return totalImbalance;
}

console.log(sumOfImbalanceNumbers([2, 3, 1, 4]));
#include <stdio.h>

int sumOfImbalanceNumbers(int* nums, int numsSize) {
    int totalImbalance = 0;
    for (int start = 0; start < numsSize; ++start) {
        int count[1001] = {0};
        int currentImbalance = 0;
        for (int end = start; end < numsSize; ++end) {
            // Adjust current imbalance as element nums[end] is added
            if (nums[end] - 1 >= 1 && count[nums[end] - 1] > 0) {
                --currentImbalance;
            }
            if (nums[end] + 1 <= numsSize && count[nums[end] + 1] > 0) {
                --currentImbalance;
            }
            ++count[nums[end]];
            if (nums[end] - 1 >= 1 && count[nums[end] - 1] == 0) {
                ++currentImbalance;
            }
            if (nums[end] + 1 <= numsSize && count[nums[end] + 1] == 0) {
                ++currentImbalance;
            }
            totalImbalance += currentImbalance;
        }
    }
    return totalImbalance;
}

int main() {
    int nums[] = {2, 3, 1, 4};
    printf("%d\n", sumOfImbalanceNumbers(nums, 4));
    return 0;
}
using System;

public class ImbalanceSum {
    public static int SumOfImbalanceNumbers(int[] nums) {
        int totalImbalance = 0;
        int n = nums.Length;
        for (int start = 0; start < n; start++) {
            int[] count = new int[n + 1];
            int imbalance = 0;
            for (int end = start; end < n; end++) {
                if (nums[end] > 1 && count[nums[end] - 1] > 0) {
                    imbalance--;
                }
                if (nums[end] < n && count[nums[end] + 1] > 0) {
                    imbalance--;
                }
                count[nums[end]]++;
                if (nums[end] > 1 && count[nums[end] - 1] == 0) {
                    imbalance++;
                }
                if (nums[end] < n && count[nums[end] + 1] == 0) {
                    imbalance++;
                }
                totalImbalance += imbalance;
            }
        }
        return totalImbalance;
    }

    public static void Main() {
        int[] nums = {2, 3, 1, 4};
        Console.WriteLine(SumOfImbalanceNumbers(nums));
    }
}

This Python implementation utilizes a similar frequency tracking adjustment to optimize performance by extending the current subarray while applying fast frequency checks to manage the imbalance count.

Complexity

Time Complexity: O(N^2)

Space Complexity: O(M) where M is the length constraint, leveraging extra space for counting effects.

Try this approach in the editor

Complexity comparison

ApproachComplexity
Brute Force Approach

Time Complexity: O(N^3 log N) because each subarray requires a sort operation.

Space Complexity: O(N) due to the space needed for sorting.

Optimized Approach with Dynamic Adjustment

Time Complexity: O(N^2)

Space Complexity: O(M) where M is the length constraint, leveraging extra space for counting effects.

Complexity analysis

ApproachTimeSpaceWhen to Use
Brute Force with Ordered SetO(n^2 log n)O(n)Good for understanding the imbalance definition and when using built‑in ordered containers
Dynamic Imbalance AdjustmentO(n^2)O(n)Preferred optimized solution for interviews and competitive programming

Frequently asked questions

Is Sum of Imbalance Numbers of All Subarrays easy or hard?

LeetCode classifies this problem as Hard because the imbalance metric is not obvious to maintain efficiently. A straightforward implementation works but is slower, while the optimal O(n^2) solution requires recognizing how inserting a value affects gaps between neighbors.

How to solve Sum of Imbalance Numbers of All Subarrays in O(n^2)?

Fix a starting index and extend the subarray one element at a time. Maintain a visited structure to record which values are already present. When inserting x, increase imbalance if neither x-1 nor x+1 exists, decrease it if both exist, otherwise leave it unchanged. Accumulate the current imbalance into the total after each extension.

What is the best approach for Sum of Imbalance Numbers of All Subarrays?

The most efficient approach uses dynamic imbalance adjustment while expanding each subarray. Track which numbers are present and update the imbalance based on whether neighbors (x-1 and x+1) exist. This avoids maintaining a sorted structure and runs in O(n^2) time with O(n) space.

Is Sum of Imbalance Numbers of All Subarrays asked at Google/Amazon/Meta?

Problems involving subarray enumeration with clever counting tricks appear frequently in interviews at companies like Google, Amazon, and Meta. This specific LeetCode problem is categorized as Hard and tests understanding of arrays, ordered relationships, and incremental counting techniques.

What data structure is used in Sum of Imbalance Numbers of All Subarrays?

Two common structures are used: ordered sets and hash-based membership tracking. The brute force method uses an ordered set (TreeSet or SortedList) to locate predecessor and successor elements. The optimized solution replaces this with a hash table or boolean array for O(1) neighbor checks.

What is the time complexity of Sum of Imbalance Numbers of All Subarrays?

The optimal algorithm runs in O(n^2) time because it enumerates all subarrays by fixing a start index and expanding the right boundary. Each insertion updates the imbalance in constant time using neighbor checks. Space complexity is O(n) for the visited array or hash structure.

Sum of Imbalance Numbers of All Subarrays Python or Java solution approach?

Both Python and Java implementations typically follow the O(n^2) dynamic adjustment strategy. Use a boolean array or HashSet to track elements in the current subarray and update the imbalance by checking x-1 and x+1. This avoids sorting and keeps each extension constant time.

Comments

Now write it yourselfClose this page and solve Sum of Imbalance Numbers of All Subarrays in the editor, without looking.
Practise Sum of Imbalance Numbers of All Subarrays