7.三数之和
方法一:使用排序+哈希
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
Set<List<Integer>> res = new HashSet<>();
int len = nums.length;
for(int i = 0; i<len-2; i++){
int target = -nums[i];
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) {
res.add(Arrays.asList(nums[i], nums[left], nums[right]));
left++;
right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
return new ArrayList<>(res);
}
}
方法二:使用双指针+排序
注意去重优化
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
for(int i = 0; i<len; i++){
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
int target = -nums[i];
int r = len - 1;
for(int l = i + 1;l < len;l++){
if(l > i + 1 && nums[l] == nums[l -1]){
continue;
}
while(l < r && nums[l] + nums[r] > target){
--r;
}
if(l == r){
break;
}
if(nums[l] + nums[r] == target){
List<Integer> list = new ArrayList<Integer>();
list.add(nums[l]);
list.add(nums[r]);
list.add(-target);
ans.add(list);
}
}
}
return ans;
}
}
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
for(int i = 0; i<len; i++){
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
int target = -nums[i];
int r = len - 1,l = i +1;
while(l < r){
int sum = nums[l] + nums[r];
if(sum == target){
List<Integer> list = new ArrayList<Integer>();
list.add(nums[l]);
list.add(nums[r]);
list.add(-target);
ans.add(list);
l++;
r--;
//去重
while(l < r && nums[l] == nums[l - 1]){
l++;
}
while(l < r && nums[l] == nums[r + 1]){
r--;
}
}else if(sum < target){
l++;
}else{
r--;
}
}
}
return ans;
}
}