发布时间:2023-09-10 18:00
题目:力扣
解题思路:
排序+双指针
排序使用的是快速排序,使数组有序
第一个数字的下标first的范围:[0,nums.length-3]
第二个数字的下标second的范围:[first+1, nums.length-2]
第三个数字的下标third的范围:[second+1, nums.length-1]
加入结果需满足的条件: nums[sencond]+nums[third] == - nums[first]
注意的点:结果不能重复
class Solution {
public void quicksort(int[] nums, int l, int r){
if(l < r){
int p = partition(nums, l, r);
quicksort(nums, l, p-1);
quicksort(nums, p+1,r);
}
}
public int partition(int[] nums, int start, int end){
int base = nums[start];
int l = start;
int h = end;
while(l < h){
while(l < h && nums[h] > base){
h--;
}
nums[l] = nums[h];
while(l < h && nums[l] <= base){
l++;
}
nums[h] = nums[l];
}
nums[l] = base;
return l;
}
public List> threeSum(int[] nums) {
List> res = new ArrayList>();
int len = nums.length;
quicksort(nums, 0, len-1);
//Arrays.sort(nums);
if( len < 3 || nums[0]> 0 || nums[len-1] <0){
return res;
}
for(int first = 0; first <= len-3; first++ ){
if(first > 0 && nums[first]==nums[first-1]){
continue;
}
int third = len -1;
int target = -nums[first];
for(int second = first+1; second < len-1; second++){
if(second > first+1 && nums[second] == nums[second-1]){
continue;
}
while(second < third && (nums[second]+nums[third])> target){
third--;
}
if(second == third){
break;
}
if((nums[second]+nums[third])== target){
List route = new ArrayList<>();
route.add(nums[first]);
route.add(nums[second]);
route.add(nums[third]);
res.add(route);
}
}
}
return res;
}
}