Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
Notice that the solution set must not contain duplicate triplets.
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Explanation:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
The distinct triplets are [-1,0,1] and [-1,-1,2].
Notice that the order of the output and the order of the triplets does not matter.
Example 2:
Input: nums = [0,1,1]
Output: []
Explanation: The only possible triplet does not sum up to 0.
Example 3:
Input: nums = [0,0,0]
Output: [[0,0,0]]
Explanation: The only possible triplet sums up to 0.
Good Approach
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
//Arrays.sort(nums); // Step 1: Sort the array
int n = nums.length;
Set<List<Integer>> st = new HashSet<>();
for (int i = 0; i < n; i++) {
Set<Integer> hashset = new HashSet<>();
for (int j = i + 1; j < n; j++) {
//Calculate the 3rd element:
int third = -(nums[i] + nums[j]);
//Find the element in the set:
if (hashset.contains(third)) {
List<Integer> temp = Arrays.asList(nums[i], nums[j], third);
Collections.sort(temp);
st.add(temp);
}
hashset.add(nums[j]);
}
}
// store the set elements in the answer:
List<List<Integer>> ans = new ArrayList<>(st);
return ans;
}
}
Optimal Approach
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums); // Step 1: Sort the array
int n = nums.length;
for (int i = 0; i < n - 2; i++) { // Step 2: Fix one number (nums[i])
if (i > 0 && nums[i] == nums[i - 1]) continue; // Skip duplicates
int left = i + 1, right = n - 1; // Two pointers
int target = -nums[i]; // We need two numbers that sum to this value
while (left < right) { // Step 3: Find two numbers that sum to `-nums[i]`
int sum = nums[left] + nums[right];
if (sum == target) { // Found a valid triplet
result.add(Arrays.asList(nums[i], nums[left], nums[right]));
// Move left and right pointers to skip duplicates
while (left < right && nums[left] == nums[left + 1]) left++;
while (left < right && nums[right] == nums[right - 1]) right--;
left++;
right--;
} else if (sum < target) {
left++; // Increase sum
} else {
right--; // Decrease sum
}
}
}
return result;
}
}
Comments
Post a Comment