这道题的思路是排序+双指针。
对于排好序的数组,存在以下几种情况:
- 当元素
i
为正数时,其之后的数字不在存在三数之和等于0的情况了。 - 当元素
i
为负数或0时,为了避免重复,依次从头遍历数组,检查当前元素i之后的区间里,是否存在nums[i] + nums[L] + nums[R]
的情况,其中L
从i+1
开始向右遍历,R
从n-1
开始向左遍历。 - 其中,若
nums[i] + nums[L] + nums[R] == 0
,则保存答案,遍历L
和R
继续找包含元素i
的三数之和,若小于0,则表示左边界过小,L++
,若大于0,则表示右边界过大,R--
。 - 在遍历
i
、L
和R
的时候,要注意避开重复数字。 - 考虑边界情况:当
nums.size()
小于3时,直接返回空数组{}
。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
int n = nums.size();
if (n < 3) return {};
for (int i = 0; i < n; ++i) {
if (nums[i] > 0) break;
if (i > 0 && nums[i] == nums[i - 1]) continue;
int L = i + 1, R = n - 1;
while (L < R) {
if (nums[i] + nums[L] + nums[R] == 0) {
ans.push_back({nums[i], nums[L], nums[R]});
while (L < R && nums[L] == nums[L + 1]) ++L;
while (L < R && nums[R] == nums[R - 1]) --R;
++L;
--R;
} else if (nums[i] + nums[L] + nums[R] < 0) {
++L;
} else {
--R;
}
}
}
return ans;
}
};
链接以前同一道题的博客记录
- Java版本
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
if (nums[0] > 0) return ans;
int n = nums.length;
int target = 100001;
for (int i = 0; i < n - 2; ++i) {
if (nums[i] > 0) break;
if (target != -nums[i]) target = -nums[i];
else continue;
int j = i + 1, k = n - 1;
while (j < k) {
if (nums[j] + nums[k] == target) {
// List<Integer> temp = new ArrayList<>();
// temp.add(nums[i]);
// temp.add(nums[j]);
// temp.add(nums[k]);
List<Integer> temp = Arrays.asList(nums[i], nums[j], nums[k]);
ans.add(temp);
while (j < k && nums[j + 1] == nums[j]) ++j;
while (j < k && nums[k - 1] == nums[k]) --k;
++j; --k;
}else if (nums[j] + nums[k] < target) {
++j;
} else {
--k;
}
}
}
return ans;
}
}
拓展:
-
Arrays.sort:
Arrays
是 Java 中用于操作数组的实用工具类。Arrays.sort
是该类中的一个方法,用于对数组进行排序。它可以对包含基本数据类型或对象的数组进行排序。例如,对于整数数组int[] arr
,您可以使用Arrays.sort(arr)
对其进行排序。
-
List<List> ans = new ArrayList<>();:
- 这行代码声明了一个变量
ans
,它是一个列表,该列表中的每个元素也是一个整数列表。ArrayList<>
是List
接口的一个实现,用于存储元素。在这种情况下,ans
是一个列表,它的每个元素都是整数列表。
- 这行代码声明了一个变量
-
List:
List<Integer>
表示一个整数类型的列表。List
是 Java 中的一个接口,它表示一种有序的集合,允许重复元素。在这里,List<Integer>
表示一个整数类型的列表。
-
Arrays.asList:
Arrays.asList
是 Java 中的一个静态方法,它允许将参数转换为列表。例如,如果您有一组整数1, 2, 3
,您可以使用Arrays.asList(1, 2, 3)
将其转换为一个整数列表。