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.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, abcd)
  • The solution set must not contain duplicate quadruplets.
    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

    A solution set is:
(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)

LeetCode 中关于数字之和还有其他几道,分别是 Two Sum ,3Sum ,3Sum Closest,虽然难度在递增,但是整体的套路都是一样的,在这里为了避免重复项,我们使用了 STL 中的 TreeSet,其特点是不能有重复,如果新加入的数在 TreeSet 中原本就存在的话,插入操作就会失败,这样能很好的避免的重复项的存在。此题的 O(n^3) 解法的思路跟 3Sum 基本没啥区别,就是多加了一层 for 循环,其他的都一样,代码如下:

解法一:

class Solution {
public:
vector<vector<int>> fourSum(vector<int> &nums, int target) {
set<vector<int>> res;
sort(nums.begin(), nums.end());
for (int i = ; i < int(nums.size() - ); ++i) {
for (int j = i + ; j < int(nums.size() - ); ++j) {
if (j > i + && nums[j] == nums[j - ]) continue;
int left = j + , right = nums.size() - ;
while (left < right) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
vector<int> out{nums[i], nums[j], nums[left], nums[right]};
res.insert(out);
++left; --right;
} else if (sum < target) ++left;
else --right;
}
}
}
return vector<vector<int>>(res.begin(), res.end());
}
};

但是毕竟用 TreeSet 来进行去重复的处理还是有些取巧,可能在 Java 中就不能这么做,那么还是来看一种比较正统的做法吧,手动进行去重复处理。主要可以进行的有三个地方,首先在两个 for 循环下可以各放一个,因为一旦当前的数字跟上面处理过的数字相同了,那么找下来肯定还是重复的。之后就是当 sum 等于 target 的时候了,在将四个数字加入结果 res 之后,left 和 right 都需要去重复处理,分别像各自的方面遍历即可,参见代码如下:

解法二:

class Solution {
public:
vector<vector<int>> fourSum(vector<int> &nums, int target) {
vector<vector<int>> res;
int n = nums.size();
sort(nums.begin(), nums.end());
for (int i = ; i < n - ; ++i) {
if (i > && nums[i] == nums[i - ]) continue;
for (int j = i + ; j < n - ; ++j) {
if (j > i + && nums[j] == nums[j - ]) continue;
int left = j + , right = n - ;
while (left < right) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
vector<int> out{nums[i], nums[j], nums[left], nums[right]};
res.push_back(out);
while (left < right && nums[left] == nums[left + ]) ++left;
while (left < right && nums[right] == nums[right - ]) --right;
++left; --right;
} else if (sum < target) ++left;
else --right;
}
}
}
return res;
}
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/18

类似题目:

Two Sum

3Sum

4Sum II

参考资料:

https://leetcode.com/problems/4sum/

https://leetcode.com/problems/4sum/discuss/8549/My-16ms-c%2B%2B-code

https://leetcode.com/problems/4sum/discuss/8575/Clean-accepted-java-O(n3)-solution-based-on-3sum

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. CentOS 6.5安装在VMWare中Bridge模式下网卡eth0不能自动激活的问题
  2. WinNTSetup v3.8.7 正式版绿色增强版
  3. c#控制台調用SSIS包互传值
  4. 函数柯理化以及利用柯理化实现bind方法
  5. H5-表格、表单
  6. 安卓开发笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑效果)
  7. Atitit。&#160;&#160;工作流引擎的发展趋势
  8. PHP数字格式化,每三位逗号分隔数字,可以保留小数
  9. Mysql query log
  10. MySQL 查看表结构
  11. MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)
  12. Unity 触屏缩放模型
  13. Link-Cut-Tree题目泛做(为了对应自己的课件)
  14. 用PowerMockito来mock私有方法(转)
  15. 从0开始的Python学习013编写一个Python脚本
  16. [Linux.NET]在CentOS 7.x中编译方式安装Nginx
  17. Flask消息闪现
  18. Ionic 2.0 相关资料
  19. Postgres空间地理类型POINT POLYGON实现附近的定位和电子围栏功能
  20. 微信小程序开发--宽为百分百,页面仍可左右滑动

热门文章

  1. linux安装redis步骤
  2. 搭建 Frp 来远程内网 Windows 和 Linux 机子
  3. MAC bash和zsh切换
  4. 在centos7 中docker info报错docker bridge-nf-call-iptables is disabled 的解决方法
  5. redis笔记2
  6. 物联网通信&#160;-&#160;RESTDemo示例程序(Java版本)
  7. JavaScript深入浅出第4课:V8引擎是如何工作的?
  8. Delphi-基础
  9. 安装教程-VMware 12 安装 Windows 10 企业版
  10. ant+jmeter+jenkins自动环境搭建