LeetCode 18 Solution: Solving the 4Sum Problem

L

If you’re tackling the LeetCode 18 Solution and working through the 4Sum problem, you’ve come to the right place! The 4Sum problem asks you to find all unique quadruplets (groups of four numbers) in an array that add up to a given target. It’s similar to the 2Sum and 3Sum problems but requires an approach that efficiently handles four numbers at a time.

Let’s walk through how to solve this problem step by step, exploring the best algorithmic approach and Python code implementation.

Understanding the 4Sum Problem

The 4Sum problem on LeetCode is straightforward but challenging. You’re given an array of integers (nums) and a target number. The goal is to return a list of unique quadruplets [a, b, c, d] such that nums[a] + nums[b] + nums[c] + nums[d] equals the target. A few important rules:

  • All four indices should be distinct.
  • The quadruplets should be unique, meaning no repeated combinations in different orders.

For example, given the array nums = [1, 0, -1, 0, -2, 2] and the target 0, the solution will be [[ -2, -1, 1, 2], [-2, 0, 0, 2], [-1, 0, 0, 1]]. Each set of four numbers adds up to the target value.

Key Insights for Solving 4Sum

Before jumping into code, let’s break down how to approach the LeetCode 18 Solution:

  1. Sorting the array: Sorting makes it easier to apply the two-pointer technique efficiently, especially when searching for pairs of numbers that sum up to a target.

  2. Nested loops and two-pointer technique: The idea is to use two loops to pick the first two numbers (i and j indices). Then, for the remaining two numbers, we can use the two-pointer method. The two-pointer approach is a great way to avoid unnecessary nested loops, keeping the solution efficient.

  3. Handling duplicates: Since the problem asks for unique quadruplets, we need to be careful not to count the same set of numbers more than once. This can be handled by skipping over duplicate values during the iteration.


Python Code for 4Sum

Below is an optimized Python implementation for the 4Sum problem:

def fourSum(nums, target):
    nums.sort()  # Sort the array first
    n = len(nums)
    result = []

    for i in range(n - 3):
        if i > 0 and nums[i] == nums[i - 1]:
            continue

        for j in range(i + 1, n - 2):
            if j > i + 1 and nums[j] == nums[j - 1]:
                continue

            left, right = j + 1, n - 1
            while left < right:
                total = nums[i] + nums[j] + nums[left] + nums[right]

                if total == target:
                    result.append([nums[i], nums[j], nums[left], nums[right]])
                    while left < right and nums[left] == nums[left + 1]:
                        left += 1
                    while left < right and nums[right] == nums[right - 1]:
                        right -= 1
                    left += 1
                    right -= 1
                elif total < target:
                    left += 1
                else:
                    right -= 1

    return result

Explanation of the Code

  1. Sorting: The first thing we do is sort the array. Sorting allows us to apply the two-pointer technique effectively. It also helps with skipping duplicate values later on.

  2. Main loops: We loop over the array twice using the variables i and j. For every combination of i and j, we apply the two-pointer approach to find two more numbers (left and right) whose sum with nums[i] and nums[j] equals the target.

  3. Skipping duplicates: By checking conditions like if i > 0 and nums[i] == nums[i - 1], we skip over duplicate values to ensure we don’t end up with repeated quadruplets in the result.

  4. Two-pointer technique: For the two numbers after i and j, the two-pointer method helps find pairs whose sum matches the target efficiently. If the sum is too small, we move the left pointer to the right. If it’s too large, we move the right pointer to the left. If we find a valid quadruplet, we store it and adjust both pointers to skip over any duplicate numbers.


Time and Space Complexity

The time complexity of this solution is O(n3). Sorting the array takes O(n log n), and the nested loops with the two-pointer approach contribute the cubic factor. While this might sound expensive, it is efficient enough for the problem’s constraints, which allow up to 200 elements in the array.

Space complexity is O(1), excluding the space required to store the result.

Key Considerations: Edge Cases and Optimization

When solving the 4Sum problem, it’s important to consider several edge cases:

  • Duplicate numbers: Arrays with repeated numbers can create duplicate quadruplets. The code handles this by checking for duplicates and skipping over them.
  • Negative and positive numbers: Our solution works for arrays that contain both positive and negative numbers, thanks to the two-pointer method, which adjusts based on whether the sum is smaller or larger than the target.
  • Small arrays: If the array has fewer than four elements, the solution naturally returns an empty list since no quadruplets are possible.

Conclusion: Cracking the 4Sum Problem

The LeetCode 18 Solution for the 4Sum problem is a great exercise in applying efficient algorithms to handle combinations of numbers. By sorting the array and using the two-pointer method, you can solve this problem in O(n3) time, which is optimal given the constraints. The Python code provided is clean, handles duplicates, and ensures you get all unique quadruplets that sum up to the target.

Whether you are preparing for coding interviews or improving your algorithmic skills, solving 4Sum will sharpen your problem-solving abilities. Keep practicing, and soon you’ll be able to tackle even more complex variations, such as k-Sum problems!

Happy Coding!


Looking for more LeetCode solutions? Stay tuned for upcoming guides on tackling other LeetCode challenges in Python. Whether you’re preparing for technical interviews or aiming to improve your coding skills, exploring a variety of problems will enhance your understanding and proficiency.

You can find this problem on LeedCode, click here.

Add comment

By Peter

About me

Hi, I’m Peter, a professional developer with over 25 years of experience. My journey with coding started when I was just a kid, exploring the world of programming and building my first projects out of pure curiosity and passion. Since then, I’ve turned this lifelong passion into a rewarding career, working on a wide range of projects, from small scripts to complex applications.

Now, I’m here to help others get started with coding through this blog. I know that learning to code can feel overwhelming at first, but I believe that with the right guidance, anyone can develop the skills they need to become a proficient programmer. My goal is to simplify the learning process and provide step-by-step resources that make coding accessible, fun, and practical for everyone.

Whether you’re just starting out or looking to sharpen your skills, I hope this blog serves as a valuable resource on your coding journey. Let’s dive into Python together!

Get in touch

Have any questions or feedback? Feel free to reach out—I’m always happy to help you on your coding journey!

Tags