题目描述
解题思路
用两个循环,时间复杂度为n的平方
最关键的问题是去重
首先对数组进行排序,排序后固定一个数 nums[i]nums[i],再使用左右指针指向 nums[i]nums[i]后面的两端,数字分别为 nums[L]nums[L] 和 nums[R]nums[R],计算三个数的和 sumsum 判断是否满足为 00,满足则添加进结果集
如果 nums[i]nums[i]大于 00,则三数之和必然无法等于 00,结束循环
如果 nums[i]nums[i] == nums[i-1]nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sumsum == 00 时,nums[L]nums[L] == nums[L+1]nums[L+1] 则会导致结果重复,应该跳过,L++L++
当 sumsum == 00 时,nums[R]nums[R] == nums[R-1]nums[R−1] 则会导致结果重复,应该跳过,R–R−−
作者:guanpengchn
链接:https://leetcode-cn.com/problems/3sum/solution/hua-jie-suan-fa-15-san-shu-zhi-he-by-guanpengchn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码
下面展示一些 内联代码片
。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
int length=nums.length;
List<List<Integer>> ans = new ArrayList();
if(length<3)
return ans;
int i=0,left,right;
Arrays.sort(nums);
while (i<=length-3)
{
if(nums[i]>0)
break;
left=i+1;
right=length-1;
while(left<right)
{
if(nums[i]+nums[left]+nums[right]==0)
{
List<Integer>ls=new ArrayList<>();
ls.add(nums[i]);
ls.add(nums[left]);
ls.add(nums[right]);
ans.add(ls);
left++;
while (nums[left-1]==nums[left]&&left<right)
left++;
right--;
while (nums[right+1]==nums[right]&&left<right)
right--;
}
else if(nums[i]+nums[left]+nums[right]<0)
{
left++;
while (nums[left-1]==nums[left]&&left<right)
left++;
}
else if(nums[i]+nums[left]+nums[right]>0)
{
right--;
while (nums[right+1]==nums[right]&&left<right)
right--;
}
}
i++;
while( nums[i] == nums[i-1]&&i<=length-3) i++;
}
return ans;
}
}