Skip to main content

Recover the Original Array - Solution & Explanation

HardArrayHash TableTwo PointersSorting11 min readAsked at: Google
Practice this problem

Problem Statement

Alice had a 0-indexed array arr consisting of n positive integers. She chose an arbitrary positive integer k and created two new 0-indexed integer arrays lower and higher in the following manner:

  1. lower[i] = arr[i] - k, for every index i where 0 <= i < n
  2. higher[i] = arr[i] + k, for every index i where 0 <= i < n

Unfortunately, Alice lost all three arrays. However, she remembers the integers that were present in the arrays lower and higher, but not the array each integer belonged to. Help Alice and recover the original array.

Given an array nums consisting of 2n integers, where exactly n of the integers were present in lower and the remaining in higher, return the original array arr. In case the answer is not unique, return any valid array.

Note: The test cases are generated such that there exists at least one valid array arr.

 

Example 1:

Input: nums = [2,10,6,4,8,12]
Output: [3,7,11]
Explanation:
If arr = [3,7,11] and k = 1, we get lower = [2,6,10] and higher = [4,8,12].
Combining lower and higher gives us [2,6,10,4,8,12], which is a permutation of nums.
Another valid possibility is that arr = [5,7,9] and k = 3. In that case, lower = [2,4,6] and higher = [8,10,12]. 

Example 2:

Input: nums = [1,1,3,3]
Output: [2,2]
Explanation:
If arr = [2,2] and k = 1, we get lower = [1,1] and higher = [3,3].
Combining lower and higher gives us [1,1,3,3], which is equal to nums.
Note that arr cannot be [1,3] because in that case, the only possible way to obtain [1,1,3,3] is with k = 0.
This is invalid since k must be positive.

Example 3:

Input: nums = [5,435]
Output: [220]
Explanation:
The only possible combination is arr = [220] and k = 215. Using them, we get lower = [5] and higher = [435].

 

Constraints:

  • 2 * n == nums.length
  • 1 <= n <= 1000
  • 1 <= nums[i] <= 109
  • The test cases are generated such that there exists at least one valid array arr.

Approach Overview

Problem Overview: You receive an array formed by taking every value x from an unknown array and inserting both x - k and x + k. The values are shuffled. The task is to reconstruct the original array and determine the elements x.

Approach 1: Sort and Compare (Sorting + Hash Table) (Time: O(n^2), Space: O(n))

Start by sorting the array. In the transformed array, the smallest value must correspond to x - k for some original element x. Try pairing it with every larger element to guess the value of k. For a candidate pair (nums[0], nums[j]), compute k = (nums[j] - nums[0]) / 2. Only continue if the difference is positive and even. Once a candidate k is chosen, rebuild the original array by greedily matching each value a with a + 2k. A frequency map (from a hash table) tracks remaining elements so each pair is used exactly once.

During reconstruction, iterate through the sorted array. If a number is still unused, treat it as x - k. Check whether x + k (which appears as a + 2k) exists in the frequency map. If it does, decrease counts for both numbers and append a + k to the result. If any required pair is missing, the chosen k is invalid and you try the next candidate.

Sorting simplifies pairing because smaller values are processed first. The hash map ensures constant-time availability checks. The algorithm essentially enumerates valid differences while verifying them using counting. Concepts from sorting, arrays, and hash-based counting drive the solution.

Recommended for interviews: The sorting + enumeration approach is what interviewers typically expect. Brute-force pairing without ordering becomes messy and error-prone. Sorting the array first and validating each possible k shows clear reasoning, controlled enumeration, and correct use of hash maps to enforce pair constraints.

Approach 1: Sort and Compare

By sorting the array, you can effectively guess the potential value of k by comparing and calculating possible values of k from the smallest or largest differences. For each guess of k, attempt reconstructing the original array.

This solution sorts the input nums and tries potential values of k derived from allowable differences between elements. For each k, potential original arrays are constructed and validated before returning.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n^2) due to the potential quadratic iteration over elements for each k verification.
Space Complexity: O(n) to store intermediary arrays for validation.

Try this approach in the editor →

Approach 2: Default Approach

Code

Python

Java

C++

Go

Try this approach in the editor →

Complexity Comparison

ApproachComplexity
Sort and Compare

Time Complexity: O(n^2) due to the potential quadratic iteration over elements for each k verification.
Space Complexity: O(n) to store intermediary arrays for validation.

Default Approach

Detailed Complexity Analysis

ApproachTimeSpaceWhen to Use
Brute Force Pair TestingO(n^3)O(n)Conceptual baseline to understand how pairs form original values
Sort + Enumerate k with Hash MapO(n^2)O(n)General solution used in interviews and competitive programming
Sort + Greedy Pair MatchingO(n^2)O(n)When using frequency counting to greedily match a with a+2k

Video Solution

Recover the Original Array | Leetcode 2122 | Contest 273 | Tricky Solution 🔥🔥🔥🔥Coding Decoded2,022 views views

Watch 9 more video solutions →

Frequently Asked Questions

Is Recover the Original Array easy or hard?
Recover the Original Array is rated Hard on LeetCode. The challenge comes from identifying the correct value of k and validating pairs efficiently while handling duplicates and maintaining element counts.
Recover the Original Array Python/Java solution
Most implementations follow the same logic across languages: sort the array, enumerate candidate k values, then use a hash map to match pairs a and a + 2k. Python uses collections.Counter, while Java typically uses HashMap for frequency tracking.
How to solve Recover the Original Array in O(n)?
An O(n) solution is generally not feasible because the algorithm must test multiple candidate values of k derived from pair differences. Each candidate requires verifying pairings across the array. The practical optimal solution is O(n^2) after sorting.
What is the best approach for Recover the Original Array?
The most reliable approach sorts the array and enumerates possible values of k using differences with the smallest element. For each candidate k, a hash map validates whether every value a can be paired with a + 2k. This approach runs in O(n^2) time with O(n) extra space and is the expected interview solution.
Is Recover the Original Array asked at Google/Amazon/Meta?
Problems involving array reconstruction, pair differences, and frequency matching appear in interviews at companies like Google, Amazon, and Meta. While the exact problem may vary, the underlying techniques—sorting, hash maps, and greedy pairing—are common interview patterns.
What data structure is used in Recover the Original Array?
A hash table (frequency map) is the main data structure. It tracks how many times each value appears so elements can be paired correctly as a and a + 2k. Sorting the array beforehand helps process elements in deterministic order.
What is the time complexity of Recover the Original Array?
The common sorting and enumeration solution runs in O(n^2) time. Sorting the array takes O(n log n), and testing each candidate k requires scanning the array with hash map checks, which leads to O(n^2) overall. Space complexity is O(n) for frequency tracking.

Ready to solve this problem?

Practice Recover the Original Array with our built-in code editor and test cases.

Practice on FleetCode