文章目录
-
- 一、题目描述
- 二、解题思路
- [三、关键点 / 易错点](#三、关键点 / 易错点)
- 四、代码实现(Java)
- 五、总结
一、题目描述
题目链接:https://leetcode.cn/problems/3sum/description/


二、解题思路
这道题的核心在于:去重和边界值的处理
具体思路如下:
- 第一步:先对数组进行排序,让数组从小到大有序
- 第二步:固定一个数,然后在剩下的区间内,进行两数之和的求解
- 第三步:两数之和的解要和固定的数的值为相反数,这样相加才为0
- 第四步:去重,对重复的元素组合去重
- 第五步:处理好边界情况。
三、关键点 / 易错点
- 边界情况:要考虑到left,right,和i的边界情况,防止索引越界
- 容易出错的地方:不仅仅要对固定的数进行去重,还需要对left指针和right指针指向的元素进行去重
- 可以优化的点:当固定的数大于0时,就可以不用继续判断,直接跳出循环。
四、代码实现(Java)
java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int n = nums.length;
// 1.对数组进行排序
Arrays.sort(nums);
//注意这里for循环里面的i++可以不要了,后面写了++,以免跳过不重复的数,漏写
for (int i = 0; i < n;) {
int left = i + 1;
int right = n - 1;
//目标值
int target = -nums[i];
while (left < right) {
//求区间内两数之和
int sum = nums[left] + nums[right];
if (sum > target) {
right--;
} else if (sum < target) {
left++;
} else {
//target == sum
List<Integer> list = new ArrayList<>();
list.add(nums[left]);
list.add(nums[right]);
list.add(nums[i]);
result.add(list);
//缩小区间
left++;
right--;
//left和 right指向的元素去重 并保证不越界
while (left < right && nums[left] == nums[left - 1])
left++;
while (left < right && nums[right] == nums[right + 1])
right--;
}
}
// 对i指向的固定元素去重 保证不越界
i++;
while (i < n && nums[i] == nums[i - 1])
i++;
}
return result;
}
}
五、总结
要处理好边界情况和去重操作需要多看看。