4sum java_【JAVA、C++】LeetCode 018 4Sum

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 };

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值