leetcode--ksum问题--3sum

Posted sloanqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode--ksum问题--3sum相关的知识,希望对你有一定的参考价值。

【题目】:点击打开链接

Given an array S of n integers, are there elements abc 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的题解

关于2Sum,3Sum的题解

LeetCode 16. 3sum

LeetCode 16. 3sum

Coursera Algorithms week1 Interview Questions: 3Sum in quadratic time

4Sum - LeetCode

(c)2006-2024 SYSTEM All Rights Reserved IT常识