题解 | #三数之和#
三数之和
https://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711
思路
将传入的数组进行排序,创建双指针,对排序后的数组进行遍历,一个从当前遍历位置前开始遍历,一个从数组尾部开始遍历,如果当前值刚好符合条件则将其加入集合
具体步骤:
- 创建一个结果集合,判断当前数组是否为空,为空返回空集合,=
- 对传入数组进行排序,创建两个指针,一个former一个 after用于标记
- 使用for循环对数组进行遍历,在其中使用while循环(former<after)来寻找三数之和(一定二动)
- 在for循环内对两个指针赋值former = i + 1; after = num.length - 1;
- 在while循环中进行判断,如果num[i] + num[former] + num[after] == 0,则将这三个值加入集合中,并且让指针移动former++;after--;
- 如果num[i] + num[former] + num[after] > 0 让after右移 ,反之则让former左移
- while循环结束后,我们需要去重,我们将集合中的数据赋值给Set集合,利用它集合内元素不重复的特性去重,再将数据倒回集合中返回即可
代码
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
// 创建结构集合
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
// 对数组进行判空
if (num.length == 0) {
return result;
}
// 对数组进行排序
Arrays.sort(num);
// 定义两个指针
int former;
int after;
// 遍历数组
for (int i = 0; i < num.length; i++) {
former = i + 1;
after = num.length - 1;
while (former < after) {
// 如果等于
if (num[i] + num[former] + num[after] == 0) {
ArrayList<Integer> temp = new ArrayList<>();
temp.add(num[i]);
temp.add(num[former]);
temp.add(num[after]);
result.add(temp);
after--;
former++;
}
// 如果大于移动after
else if (num[i] + num[former] + num[after] > 0) {
after--;
}
// 如果小于移动former
else {
former++;
}
}
}
// 去重
Set<ArrayList<Integer>> temporary = new LinkedHashSet<>(result);
result.clear();
result.addAll(temporary);
return result;
}
}