Start learning free

LESSON 251 OF 410 · TWO POINTERS

Array Diff in O(n log n) Time Complexity using JavaScript

Practice O(n log n) Read the full explanation

Given two arrays of integers, find a pair of integers, one from each array, whose absolute difference is the closest to zero.

Example:

Input: first = [4, 1, 8],
       second = [12, 3, 17]

Output: [4, 3]
Explanation: |4 - 3| = 1 which is the closest to 0
			

Note:

Your algorithm should run in O(n log n) time and use O(1) extra space (not counting the sort itself and the returned pair).


STEP 1 OF 11
    Ctrl + Enter to check

    JAVASCRIPT · TWO POINTERS

    Array Diff in JavaScript, explained

    Problem Definition

    The problem requires finding a pair of integers, one from each of the two given arrays, such that their absolute difference is the closest to zero. The input consists of two arrays of integers, and the output should be a pair of integers.

    Input:

    • Two arrays of integers, first and second.

    Output:

    • A pair of integers, one from each array, whose absolute difference is the closest to zero.

    Constraints and Assumptions:

    • The arrays can contain both positive and negative integers.
    • The arrays are non-empty.
    • The solution should run in O(n log n) time and use O(1) extra space.

    Example:

    Input: first =[4, 1, 8],
           second = [12, 3, 17]
    
    Output: [4, 3]
    Explanation: abs(4-3) = 1 which is the closest to 0
    

    Understanding the Problem

    The core challenge is to find the pair of integers from two arrays whose absolute difference is minimal. This problem is significant in scenarios where we need to find the closest match between two sets of data, such as in merging datasets or finding the nearest neighbors in search algorithms.

    Potential pitfalls include assuming that the arrays are sorted or not considering negative numbers, which can lead to incorrect results.

    Approach

    To solve this problem efficiently, we can use the following approach:

    Naive Solution:

    A naive solution would involve checking every possible pair of integers from the two arrays and calculating their absolute difference. This would result in a time complexity of O(n * m), where n and m are the lengths of the two arrays. This is not optimal for large arrays.

    Optimized Solution:

    To achieve the desired O(n log n) time complexity, we can follow these steps:

    1. Sort both arrays.
    2. Use two pointers to traverse the arrays and find the pair with the smallest absolute difference.

    Sorting the arrays takes O(n log n) time, and using two pointers to find the closest pair takes O(n) time, resulting in an overall time complexity of O(n log n).

    Algorithm

    Here is a step-by-step breakdown of the optimized algorithm:

    1. Sort both arrays.
    2. Initialize two pointers, one for each array.
    3. Initialize a variable to keep track of the minimum difference and the corresponding pair.
    4. While both pointers are within the bounds of their respective arrays:
      • Calculate the absolute difference between the elements pointed to by the two pointers.
      • If this difference is smaller than the current minimum difference, update the minimum difference and the pair.
      • Move the pointer that points to the smaller element to the next position.
    5. Return the pair with the smallest absolute difference.

    Code Implementation

    // Function to find the pair with the smallest absolute difference
    function findClosestPair(first, second) {
        // Sort both arrays
        first.sort((a, b) => a - b);
        second.sort((a, b) => a - b);
    
        // Initialize pointers for both arrays
        let i = 0;
        let j = 0;
    
        // Initialize variables to track the minimum difference and the pair
        let minDiff = Infinity;
        let closestPair = [];
    
        // Traverse both arrays using the pointers
        while (i < first.length && j < second.length) {
            // Calculate the absolute difference
            let diff = Math.abs(first[i] - second[j]);
    
            // Update the minimum difference and the pair if a smaller difference is found
            if (diff < minDiff) {
                minDiff = diff;
                closestPair = [first[i], second[j]];
            }
    
            // Move the pointer that points to the smaller element
            if (first[i] < second[j]) {
                i++;
            } else {
                j++;
            }
        }
    
        // Return the pair with the smallest absolute difference
        return closestPair;
    }
    
    // Example usage
    const first = [4, 1, 8];
    const second = [12, 3, 17];
    console.log(findClosestPair(first, second)); // Output: [4, 3]
    

    Complexity Analysis

    The time complexity of the optimized solution is O(n log n) due to the sorting step. The space complexity is O(1) as we are using a constant amount of extra space.

    Edge Cases

    Potential edge cases include:

    • Arrays with only one element each.
    • Arrays with negative numbers.
    • Arrays with duplicate elements.

    Each of these cases should be tested to ensure the algorithm handles them correctly.

    Testing

    To test the solution comprehensively, consider the following test cases:

    // Test case 1: Basic example
    console.log(findClosestPair([4, 1, 8], [12, 3, 17])); // Output: [4, 3]
    
    // Test case 2: Arrays with one element each
    console.log(findClosestPair([5], [10])); // Output: [5, 10]
    
    // Test case 3: Arrays with negative numbers
    console.log(findClosestPair([-1, -3, -5], [2, 4, 6])); // Output: [-1, 2]
    
    // Test case 4: Arrays with duplicate elements
    console.log(findClosestPair([1, 2, 2, 3], [3, 3, 4, 5])); // Output: [3, 3]
    

    Thinking and Problem-Solving Tips

    When approaching such problems, consider the following tips:

    • Break down the problem into smaller, manageable parts.
    • Think about different approaches and their time complexities.
    • Use sorting and two-pointer techniques to optimize solutions.
    • Practice solving similar problems to improve problem-solving skills.

    Conclusion

    In this blog post, we discussed how to find a pair of integers from two arrays whose absolute difference is the closest to zero. We explored a naive solution and an optimized solution with O(n log n) time complexity. We also provided a detailed explanation of the algorithm, code implementation, complexity analysis, and testing.

    Understanding and solving such problems is crucial for improving algorithmic thinking and problem-solving skills. Practice and exploration of similar problems can further enhance these skills.

    Additional Resources

    For further reading and practice, consider the following resources:

    • LeetCode - A platform for practicing coding problems.
    • GeeksforGeeks - A comprehensive resource for learning algorithms and data structures.
    • HackerRank - A platform for coding challenges and competitions.
    Keep going with JavaScriptAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free