Força Bruta
1class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> threeSums = new ArrayList<>();
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++) {
if (nums[i] + nums[j] + nums[k] == 0) {
List<Integer> sortedAnswer = Arrays.asList(nums[i], nums[j], nums[k]);
Collections.sort(sortedAnswer);
if (!threeSums.contains(sortedAnswer)) {
threeSums.add(sortedAnswer);
}
}
}
}
}
return threeSums;
}
}
Complexidade de Tempo/Espaço
- Complexidade de tempo:
O(n³)
- Complexidade do espaço:
O(len(answer))
(a complexidade do espaço será dimensionada de acordo com o número de trigêmeos encontrados)
Hashmap de soma dupla
1class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> threeSums = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int target = -nums[i];
int l = i + 1, r = nums.length - 1;
while (l < r) {
if (nums[l] + nums[r] == target) {
threeSums.add(Arrays.asList(nums[i], nums[l], nums[r]));
l++;
while (l < r && nums[l] == nums[l - 1]) {
l++;
}
} else if (nums[l] + nums[r] < target) {
l++;
} else {
r--;
}
}
}
return threeSums;
}
}
Complexidade de Tempo/Espaço
- Complexidade de tempo:
O(n²)
- Complexidade do espaço:
O(n)
(ou O(1)
se classificado no local)