15.三数之和 - Java 双指针 贪心

Smile_slime_47

原题地址: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;

}
}
Comments
On this page
15.三数之和 - Java 双指针 贪心