LeetCode-015-三数之和
思路
固定一个,然后用双指针进行遍历即可,记得去重
参考三数之和(排序+双指针,易懂图解)
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans=new ArrayList<>();
if(nums==null||nums.length<3)return ans;//数组长度小于三,直接返回
Arrays.sort(nums);//排序
for(int i=0;i<nums.length-2;i++){
if(nums[i]>0) return ans;//最小的数大于0.则三数和必定大于0.返回
if(i>0&&nums[i]==nums[i-1])continue;//如果数字已经出现过,下一个
int left=i+1,right=nums.length-1;//左边为下一个,右边为数组尾部
int target=-nums[i];//目的和就是固定的相反数
while(left<right){
if(nums[left]+nums[right]==target)
{
ans.add(new ArrayList<>(Arrays.asList(nums[i], nums[left], nums[right])));
left++;right--;
//相同跳到下一个
while(left<right&&nums[left]==nums[left-1])left++;
while(left<right&&nums[right]==nums[right+1])right--;
}
//小于目的和,左边加,大于目的和,右边减
else if(nums[left]+nums[right]<target)left++;
else right--;
}
}
return ans;
}
}