题目
给你一个整数数组
nums
,判断是否存在三元组[nums[i], nums[j], nums[k]]
满足i != j
、i != k
且j != k
,同时还满足nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为0
且不重复的三元组。
注意
- 列表添加元素:
List<List<Integer>> list = new ArrayList<List<Integer>>();
List<Integer> lists = new ArrayList<Integer>();
lists.add(nums[left]);
lists.add(nums[i]);
lists.add(nums[right]);
list.add(lists);
- 对数组进行排序:
Arrays.sort(nums);
- 去除重复解:
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
- 双指针(左指针 left = i + 1,右指针 right = l - 1):
if (nums[i] + nums[left] + nums[right] == 0)
left++; right--;
if (nums[i] + nums[left] + nums[right] < 0)
left++;
if (nums[i] + nums[left] + nums[right] > 0)
right--;
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
Arrays.sort(nums);
int l = nums.length;
for (int i = 0; i < l - 1; i++) {
int left = i + 1, right = l - 1;
while (left < right) {
if (nums[i] + nums[left] + nums[right] == 0) {
List<Integer> lists = new ArrayList<Integer>();
lists.add(nums[left]);
lists.add(nums[i]);
lists.add(nums[right]);
list.add(lists);
left++;
right--;
} else if (nums[i] + nums[left] + nums[right] < 0) {
left++;
} else if (nums[i] + nums[left] + nums[right] > 0) {
right--;
}
}
}
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
return list;
}
}