原题地址:https://leetcode.cn/problems/3sum/
题解
首先对nums排序
一层循环:在nums里顺序遍历数i
二层循环:left和right指针分别设置在nums[i+1]——nums[length]两端
- 若i+left+right<0则说明需要更大的正数,left++,反之则right–
- 若i+left+right=0则将三元组加入List,然后left++,right–
去重:i、left、right推进时若读到重复数则跳过,以便去重
时间复杂度:O(N^2)
空间复杂度:O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> ans=new LinkedList<>(); List<Integer> tmp; Arrays.sort(nums); int j,k; for(int i=0;i<nums.length&&nums[i]<=0;i++){ if(i>0&&nums[i]==nums[i-1])continue; j=i+1; k=nums.length-1; tmp=new LinkedList<>();
while (j<k){ if(nums[i]+nums[j]+nums[k]==0){ tmp.add(nums[i]); tmp.add(nums[j]); tmp.add(nums[k]); ans.add(tmp); tmp=new LinkedList<>(); j++; while(j<k&&nums[j]==nums[j-1])j++; k--; while(j<k&&nums[k]==nums[k+1])k--; }else if(nums[i]+nums[j]+nums[k]<0){ j++; }else{ k--; } } } return ans;
} }
|