目录
- [1- 思路](#1- 思路)
-
- [双指针法-三指针 定1+移动2](#双指针法-三指针 定1+移动2)
- [2- 实现](#2- 实现)
-
- [⭐15. 三数之和------题解思路](#⭐15. 三数之和——题解思路)
- [3- ACM 实现](#3- ACM 实现)
- 原题链接:15. 三数之和
1- 思路
双指针法-三指针 定1+移动2
- 1- 先排序------>用于去重
- 2- 遍历nums数组
- 2.1 去重i:遇到 当
i
大于0
时,i
和i-1
相等 continue - 2.2 定义
left
和right
指针,利用while
处理 - 2.3 求和
sum
,为三数和 - 2.4 移动指针:如果
sum>0
移动right
,如果sum<0
移动left
。否则 收集结果 - 2.5 收集结果后去重 :
left
和right
- 2.1 去重i:遇到 当
2- 实现
⭐15. 三数之和------题解思路

java
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
for(int i = 0 ; i < nums.length;i++){
if(i>0 && nums[i-1] == nums[i]){
continue;
}
int left = i+1;
int right = nums.length-1;
while(left<right){
int sum = nums[i] + nums[left] + nums[right];
if(sum>0){
right--;
}else if(sum<0){
left++;
}else{
res.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--;
left++;
right--;
}
}
}
return res;
}
}
3- ACM 实现
java
public class threeSum {
public static List<List<Integer>> res = new ArrayList<>();
public static List<List<Integer>> threeSum1(int[] nums){
Arrays.sort(nums);
for(int i = 0 ; i < nums.length;i++){
// 2.1去重i
if(i>0 && nums[i]==nums[i-1]){
continue;
}
//2.双指针
int left = i+1;
int right = nums.length-1;
while (left<right){
int sum = nums[i] + nums[left] + nums[right];
if(sum>0){
right--;
}else if(sum<0){
left++;
}else{
res.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
while(left<right && nums[left] == nums[left+1]) left++;
while (left<right && nums[right-1] == nums[right]) right--;
left++;
right--;
}
}
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入数组长度");
int n = sc.nextInt();
int[] nums = new int[n];
for(int i = 0 ; i < n ;i++){
nums[i] = sc.nextInt();
}
System.out.println("结果是"+threeSum1(nums).toString());
}
}