From : https://leetcode.com/problems/3sum/
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:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- 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)
class Solution {
public :
vector<vector<int> > threeSum(vector<int>& nums) {
vector<vector<int> > res;
if(nums.size()==0) return res;
sort(nums.begin(), nums.end());
int j, k, len = nums.size(), sum;
for(int i=0; i<nums.size(); i++) {
if(nums[i] > 0) break;
while(i<nums.size() && i>0 && nums[i] == nums[i-1]) i++;
j=i+1; k=len-1;
while(j<k) {
while(j>i+1 && j<len && nums[j]==nums[j-1]) j++;
while(j<k && k<len-1 && nums[k]==nums[k+1]) k--;
if(k<=j) break;
sum = nums[i]+nums[j]+nums[k];
if(sum == 0) {
vector<int> cur;
cur.push_back(nums[i]);
cur.push_back(nums[j]);
cur.push_back(nums[k]);
res.push_back(cur);
j++;k--;
} else if(sum>0) {
k--;
} else {
j++;
}
}
}
return res;
}
};public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
if(null == nums || nums.length < 3) {
return new ArrayList<List<Integer>>();
}
List<List<Integer>> ans = new ArrayList<List<Integer>>();
Arrays.sort(nums);
for(int i=0, lst=nums.length-1; i<lst && nums[i]<=0; ++i) {
if(i>0 && nums[i]==nums[i-1]) continue;
int j = i+1, k = lst;
while(j < k) {
if(j>i+1 && nums[j]==nums[j-1]) {
++j;
continue;
}
if(k<lst && nums[k]==nums[k+1]) {
--k;
continue;
}
int sum = nums[i]+nums[j]+nums[k];
if(sum == 0) {
List<Integer> cur = new ArrayList<Integer>();
cur.add(nums[i]);
cur.add(nums[j++]);
cur.add(nums[k--]);
ans.add(cur);
} else if(sum < 0) {
++j;
} else {
--k;
}
}
}
return ans;
}
}
本文探讨了LeetCode上经典问题“三数之和”的解决方案。该问题要求从整数数组中找出所有不重复的三个数,使得它们的和为零,并确保找到的三元组按非递减顺序排列。文章提供了详细的C++和Java代码实现,通过排序和双指针技巧高效解决问题。
493

被折叠的 条评论
为什么被折叠?



