leetcode--ksum问题--3sum
Posted sloanqin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode--ksum问题--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: 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] ]
【说明】:这个3sum,有个O(N*N)的解法,而且2sum 3sum 4sum ksum问题是一脉相承的;在剑指offer上有关于2sum问题的描述(和为s的两个数字),3sum的求解,可以建立在2sum的基础上;详细的阐述可以见下面转载的文章,我这里只给出我写的代码;
【代码】:
#include <unordered_set>
#include <algorithm>
#include <vector>
class Solution
public:
vector<vector<int>> threeSum(vector<int>& nums)
vector<vector<int>> result;
unordered_set<string> distinctSet;
if (nums.size()<3) return result;
sort(nums.begin(), nums.end());
int i = 0;
int lenNums = nums.size();
for (i = 0; i<lenNums - 2; ++i)
int sum = -1 * nums[i];
int left = i + 1;
int right = lenNums - 1;
while (left<right)
//if 3 sum ==0
if (nums[left] + nums[right] == sum)
string key = to_string(nums[i]) + to_string(nums[left]) + to_string(nums[right]);
if (distinctSet.count(key) == 0)//check whether have been add to result
result.push_back(vector<int> nums[i], nums[left], nums[right]);
distinctSet.insert(key);
left++;
else if ((nums[left] + nums[right]) < sum)
left++;
continue;
else if ((nums[left] + nums[right]) > sum)
right--;
continue;
return result;
;
【转载】:下面的这一段是转载,出自:http://blog.csdn.net/sunnyyoona/article/details/18447671
做过leetcode的人都知道, 里面有2sum, 3sum(closest), 4sum等问题, 这些也是面试里面经典的问题, 考察是否能够合理利用排序这个性质, 一步一步得到高效的算法. 经过总结, 本人觉得这些问题都可以使用一个通用的K sum求和问题加以概括消化, 这里我们先直接给出K Sum的问题描述和算法(递归解法), 然后将这个一般性的方法套用到具体的K, 比如leetcode中的2Sum, 3Sum, 4Sum问题. 同时我们也给出另一种哈希算法的讨论.
leetcode求和问题描述(K sum problem):
K sum的求和问题一般是这样子描述的:给你一组N个数字(比如 vector<int> num), 然后给你一个常数(比如 int target) ,我们的goal是在这一堆数里面找到K个数字,使得这K个数字的和等于target。
注意事项(constraints):
注意这一组数字可能有重复项:比如 1 1 2 3 , 求3sum, 然后 target = 6, 你搜的时候可能会得到 两组1 2 3, 1 2 3,1 来自第一个1或者第二个1, 但是结果其实只有一组,所以最后结果要去重。
K Sum求解方法, 适用leetcode 2Sum, 3Sum, 4Sum:
方法一: 暴力,就是枚举所有的K-subset, 那么这样的复杂度就是 从N选出K个,复杂度是O(N^K)
方法二: 排序,这个算法可以考虑最简单的case, 2sum,这是个经典问题,方法就是先排序,然后利用头尾指针找到两个数使得他们的和等于target, 这个2sum算法网上一搜就有,这里不赘述了,给出2sum的核心代码:
01 | //2 sum |
02 | int i = starting; //头指针 |
03 | int j = num.size() - 1; //尾指针 |
04 | while (i < j) |
05 | int sum = num[i] + num[j]; |
06 | if (sum == target) |
07 | store num[i] and num[j] somewhere; |
08 | if (we need only one such pair of numbers) |
09 | break ; |
10 | otherwise |
11 | do ++i, --j; |
12 |
|
关于2Sum,3Sum的题解
Coursera Algorithms week1 Interview Questions: 3Sum in quadratic time |