LeetCode 15. 3Sum (三数之和)
题目
链接
https://leetcode-cn.com/problems/3sum/
问题描述
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
提示
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
思路
第一个数字可以采用普通循环,第二三个数字采用双指针寻找,同时用hash来去重。
复杂度分析
时间复杂度 O(n2)
空间复杂度 O(n)
代码
Java
public List<List<Integer>> threeSum(int[] nums) {
HashSet<List<Integer>> all = new HashSet<>();
ArrayList<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
int n = nums.length;
if (n < 3) {
return ans;
}
for (int i = 0; i < n - 2; i++) {
int sum = nums[i];
int left = i + 1;
int right = n - 1;
while (left < right) {
int tmpsum = sum + nums[left] + nums[right];
if (tmpsum == 0) {
List<Integer> tmp = new ArrayList<>();
tmp.add(sum);
tmp.add(nums[left++]);
tmp.add(nums[right--]);
all.add(tmp);
} else if (tmpsum < 0) {
left++;
} else {
right--;
}
}
}
Iterator<List<Integer>> iterator = all.iterator();
while (iterator.hasNext()) {
ans.add(iterator.next());
}
return ans;
}