Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
Subscribe to see which companies asked this question.
题意:
给定一个整数数组S,是否存在三个元素使得a+b+c=0成立,找到数组中所有成立的组合(不含重复的组合)
题解:
如果能够事先确定一个元素,那么问题变成了2sum问题。
事先确定的元素可以是数组中任意一个,故遍历数组并试图将每个元素作为事先确定的元素,然后执行2sum过程。
Code【Java】
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
// 处理特殊情况
if (nums.length < 3) {
return new ArrayList<List<Integer>>();
}
// 数组排序
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<List<Integer>>();
// 从第一个开始查找
for (int i = 0; i < nums.length - 2; ++i) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
// 对于每个元素寻找其0 - val的2sum解
for (int lo = i + 1, hi = nums.length - 1; lo < hi;) {
int result = nums[i] + nums[lo] + nums[hi];
if (result == 0) {
// 防止重复
ans.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[lo], nums[hi])));
while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
lo++;
hi--;
}
else if (result > 0) {
--hi;
} else {
++lo;
}
}
}
return ans;
}
}
Code【C++】
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
// 处理特殊情况
if (nums.size() < 3) {
return vector<vector<int>>();
}
// 数组排序
sort(nums.begin(), nums.end());
vector<vector<int>> ans;
// 从第一个开始查找
for (int i = 0; i < nums.size() - 2; ++i) {
if (i > 0 && nums[i] == nums[i - 1]) continue;
// 对于每个元素寻找其0 - val的2sum解
for (int lo = i + 1, hi = nums.size() - 1; lo < hi;) {
int result = nums[i] + nums[lo] + nums[hi];
if (result == 0) {
// 防止重复
int v[] = {nums[i], nums[lo], nums[hi]};
ans.push_back(vector<int>(v, v + 3));
while (lo < hi && nums[lo] == nums[lo + 1]) lo++;
while (lo < hi && nums[hi] == nums[hi - 1]) hi--;
lo++;
hi--;
}
else if (result > 0) {
--hi;
} else {
++lo;
}
}
}
return ans;
}
};