diff --git a/checkstyle.xml b/checkstyle.xml index d78724455af7..316563c3b5a0 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -155,7 +155,7 @@ - + @@ -175,7 +175,7 @@ - + diff --git a/src/main/java/com/thealgorithms/misc/FourSumProblem.java b/src/main/java/com/thealgorithms/misc/FourSumProblem.java new file mode 100644 index 000000000000..3a23304a0d78 --- /dev/null +++ b/src/main/java/com/thealgorithms/misc/FourSumProblem.java @@ -0,0 +1,58 @@ +package com.thealgorithms.misc; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class FourSumProblem { + + public static List> fourSum(int[] nums, int target) { + List> result = new ArrayList<>(); + + if (nums == null || nums.length < 4) { + return result; // if array is too small to have 4 numbers, return empty result + } + + // Sort the array first + Arrays.sort(nums); + + // Iterate through the array, fixing the first two elements + for (int i = 0; i < nums.length - 3; i++) { + if (i > 0 && nums[i] == nums[i - 1]) continue; // Skip duplicates for the first element + + for (int j = i + 1; j < nums.length - 2; j++) { + if (j > i + 1 && nums[j] == nums[j - 1]) continue; // Skip duplicates for the second element + + // Use two pointers for the remaining two elements + int left = j + 1; + int right = nums.length - 1; + + while (left < right) { + int sum = nums[i] + nums[j] + nums[left] + nums[right]; + + if (sum == target) { + // If we found a quadruplet, add it to the result list + result.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right])); + + // Skip duplicates for the third element + while (left < right && nums[left] == nums[left + 1]) left++; + // Skip duplicates for the fourth element + while (left < right && nums[right] == nums[right - 1]) right--; + + // Move the pointers + left++; + right--; + } else if (sum < target) { + // If the sum is less than the target, move the left pointer to increase the sum + left++; + } else { + // If the sum is greater than the target, move the right pointer to decrease the sum + right--; + } + } + } + } + + return result; + } +}