Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
解题思路一:
四路夹逼,C++:
1 classSolution {2 public:3 vector > fourSum(vector &num, inttarget) {4 vector >res;5 if (num.size() <4)6 returnres;7 sort(num.begin(), num.end());8 for (int i = 0; i <= num.size() - 4; i++) {9 for (int j = i + 1; j <= num.size() - 3; j++) {10 int k = j + 1, l = num.size() - 1;11 while (k target)15 l--;16 else{17 res.push_back({ num[i], num[j], num[k], num[l] });18 k++;19 l--;20 while (num[k] == num[k - 1] && k
解题思路二:
分治,存储所有2个元素的和,然后采用第一题2sum的思路求解即可,这样时间复杂度不过O(n^2)
JAVA实现如下:
static public List> fourSum(int[] num, int target) {
Set> set = new LinkedHashSet>();
HashMap> hm = new HashMap>();
Arrays.sort(num);
for (int i = 0; i < num.length - 1; i++)
for (int j = i + 1; j < num.length; j++) {
int sum = num[i] + num[j];
Integer[] tuple = { num[i], i, num[j], j };
if (!hm.containsKey(sum))
hm.put(sum, new ArrayList());
hm.get(sum).add(tuple);
}
HashSet keys= new HashSet(hm.keySet());
for (int key : keys) {
if (hm.containsKey(key)) {
if (hm.containsKey(target - key)) {
List pairs1 = hm.get(key),pairs2 = hm.get(target - key);
for (int i = 0; i < pairs1.size(); ++i) {
Integer[] first = pairs1.get(i);
for (int j = 0; j < pairs2.size(); ++j) {
Integer[] second = pairs2.get(j);
if (first[1] != second[1] && first[1] != second[3]
&& first[3] != second[1]
&& first[3] != second[3]) {
List tempList = Arrays.asList(first[0],
first[2], second[0], second[2]);
Collections.sort(tempList);
set.add(tempList);
}
}
}
hm.remove(key);
hm.remove(target - key);
}
}
}
return new ArrayList>(set);
}
C++(TLE):
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 using namespacestd;9 classSolution {10 public:11 vector> fourSum(vector& nums, inttarget) {12 set>res;13 vector>result;14 if (nums.size() < 4)15 returnresult;16 sort(nums.begin(), nums.end());17 unordered_map>>hm ;18 for (int i = 0; i < nums.size() - 1; i++) {19 for (int j = i + 1; j < nums.size(); j++) {20 int sum = nums[i] +nums[j];21 vector tuple ={ nums[i], i, nums[j], j };22 unordered_map>>::iterator iter;23 iter =hm.find(sum);24 if (iter ==hm.end()) {25 vector>tempv;26 hm.insert(unordered_map>>::value_type(sum, tempv));27 }28 hm[sum].push_back(tuple);29 }30 }31 setkeys;32 unordered_map>>::iterator iter;33 for (iter = hm.begin(); iter != hm.end(); iter++) {34 keys.insert(iter->first);35 }36 for (intkey : keys) {37 unordered_map>>::iterator iter;38 iter =hm.find(key);39 if (iter !=hm.end()){40 unordered_map>>::iterator iter;41 iter = hm.find(target -key);42 if (iter !=hm.end()){43 vector> pairs1 = hm[key], pairs2 = hm[target -key];44 for (int i = 0; i < pairs1.size(); ++i) {45 vector first =pairs1[i];46 for (int j = 0; j < pairs2.size(); ++j) {47 vector second =pairs2[j];48 if (first[1] != second[1] && first[1] != second[3]49 && first[3] != second[1]50 && first[3] != second[3]) {51 vector tempList = { first[0],first[2], second[0], second[2] };52 sort(tempList.begin(), tempList.end());53 res.insert(tempList);54 }55 }56 }57 hm.erase(key);58 hm.erase(target -key);59 }60 }61 }62 copy(res.begin(), res.end(), back_inserter(result));63 returnresult;64 }65 };