What if you could find all groups of four numbers adding to a target without checking every single combination?
Why Four Sum Problem All Unique Quadruplets in DSA Java?
Imagine you have a list of numbers and you want to find all groups of four numbers that add up to a specific target. Doing this by checking every possible group by hand would take forever, especially if the list is long.
Manually checking every combination means trying thousands or millions of groups. This is slow and easy to make mistakes. You might miss some groups or count the same group more than once.
The Four Sum problem uses a smart way to find all unique groups of four numbers that add up to the target. It sorts the list and uses pointers to skip duplicates and quickly find the right groups without checking everything.
for (int i = 0; i < nums.length; i++) { for (int j = i+1; j < nums.length; j++) { for (int k = j+1; k < nums.length; k++) { for (int l = k+1; l < nums.length; l++) { if (nums[i] + nums[j] + nums[k] + nums[l] == target) { // add quadruplet } } } } }
Arrays.sort(nums); for (int i = 0; i < nums.length - 3; i++) { if (i > 0 && nums[i] == nums[i-1]) continue; for (int j = i + 1; j < nums.length - 2; j++) { if (j > i + 1 && nums[j] == nums[j-1]) continue; int left = j + 1, right = nums.length - 1; while (left < right) { int sum = nums[i] + nums[j] + nums[left] + nums[right]; if (sum == target) { // add quadruplet left++; right--; while (left < right && nums[left] == nums[left-1]) left++; while (left < right && nums[right] == nums[right+1]) right--; } else if (sum < target) { left++; } else { right--; } } } }
This method lets you quickly find all unique sets of four numbers that add up to your target, even in large lists, without missing or repeating groups.
Suppose you want to find four products from a store that together cost exactly your gift card amount. This method helps find all such combinations fast and without repeats.
Manual checking of all quadruplets is slow and error-prone.
Sorting and using pointers skips duplicates and speeds up the search.
Efficiently finds all unique quadruplets that sum to the target.
Practice
Four Sum Problem in data structures and algorithms?Solution
Step 1: Understand the problem statement
The Four Sum Problem asks to find sets of four numbers in an array that add up to a given target.Step 2: Identify the expected output
We want all unique quadruplets, meaning no repeated sets, that sum exactly to the target.Final Answer:
Find all unique quadruplets in an array that sum up to a target value -> Option AQuick Check:
Four Sum = unique quadruplets summing to target [OK]
- Confusing Four Sum with Two Sum or Three Sum problems
- Ignoring uniqueness of quadruplets
- Trying to find maximum or minimum instead of sum
Solution
Step 1: Check Java syntax for list initialization
Correct generic syntax for a list of lists of integers isList quadruplets = new ArrayList<>();Step 2: Identify errors in other options
List quadruplets = new List<>(); uses raw List without generics and wrong constructor; ArrayList<int> quadruplets = new ArrayList<>(); uses primitive int which is invalid; List<List> quadruplets = new ArrayList(); mixes generics incorrectly.Final Answer:
List quadruplets = new ArrayList<>(); -> Option BQuick Check:
Correct generic list initialization = List quadruplets = new ArrayList<>(); [OK]
- Using raw types without generics
- Trying to use primitive types in generics
- Incorrect constructor calls for List
int[] nums = {1, 0, -1, 0, -2, 2};
int target = 0;
List result = fourSum(nums, target);
System.out.println(result);Assuming
fourSum correctly finds all unique quadruplets summing to target.Solution
Step 1: Sort and find quadruplets summing to zero
Sorted array: [-2, -1, 0, 0, 1, 2]. Quadruplets summing to 0 are [-2,-1,1,2], [-2,0,0,2], and [-1,0,0,1].Step 2: Verify uniqueness and completeness
All quadruplets are unique and sum exactly to target 0. No other quadruplets exist.Final Answer:
[[-2, -1, 1, 2], [-2, 0, 0, 2], [-1, 0, 0, 1]] -> Option CQuick Check:
Unique quadruplets sum to 0 = [[-2, -1, 1, 2], [-2, 0, 0, 2], [-1, 0, 0, 1]] [OK]
- Not sorting array before processing
- Including duplicate quadruplets
- Missing some valid quadruplets
for (int i = 0; i < nums.length - 3; i++) {
for (int j = i + 1; j < nums.length - 2; j++) {
int left = j + 1, right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
left++;
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
}Solution
Step 1: Analyze loop and pointer usage
Loops and pointers are correctly set to find quadruplets, and sum calculation is correct.Step 2: Identify missing duplicate skipping
Code lacks checks to skip duplicate values for i, j, left, and right after finding a quadruplet, which can cause duplicate quadruplets in result.Final Answer:
Missing checks to skip duplicate elements for i, j, left, and right -> Option DQuick Check:
Duplicate skipping missing = Missing checks to skip duplicate elements for i, j, left, and right [OK]
- Not skipping duplicates causing repeated quadruplets
- Changing pointers incorrectly inside loops
- Incorrect loop boundaries causing index errors
nums = {2, 2, 2, 2, 2} and target 8, what is the correct output of the Four Sum problem solution that finds all unique quadruplets?Solution
Step 1: Check if quadruplets sum to target
All elements are 2, so quadruplet [2, 2, 2, 2] sums to 8.Step 2: Ensure uniqueness of quadruplets
Even though elements repeat, only one unique quadruplet exists. Duplicates must be avoided.Final Answer:
[[2, 2, 2, 2]] -> Option AQuick Check:
Unique quadruplet summing to 8 = [[2, 2, 2, 2]] [OK]
- Returning duplicate quadruplets multiple times
- Returning empty list when quadruplet exists
- Confusing triple with quadruplet
Ready to prove it?
Pass the test and this pattern moves unknown
