【LeetCode】四数之和
【问题】给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:答案中不可以包含重复的四元组。
示例: 给定数组 nums = [, , -, , -, ],和 target = 。 满足要求的四元组集合为:
[
[-, , , ],
[-, -, , ],
[-, , , ]
]
【思路】
四数之和的大体思路是:首先固定两个数,然后将思路之和的问题变成两数之和,使用双指针的方法去寻找,由于对于两数之和,使用双指针的前提数组是一个排序数组,因此我们先对该数组进行排序,然后根据上述的思路再去遍历。
注意在遍历时候的几种剪枝方法:
如果nums[i]>target && target>0,说明后面的nums[i]肯定不存在我们想要的值,因为后面的值都大于target.
固定的两个元素不能是相同元素,如果是相同的元素,那么经过两数求和算法后势必会存在重复的四元组,因此我们需要判断j > i+1 && nums[j][j-1], 如果为真,两数之和算法不会运行!
两数求和怎么去重的就不解释了,遇到重复的,让指针跳过就好了!
如果不想这么麻烦,可以使用DFS方法中的set去重
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
if(nums.size()<) return {};
sort(nums.begin(),nums.end());
vector<vector<int>> res;
for(int i=;i<nums.size()-;i++)
{
if(nums[i]>target&&target>) break;
if(i> && nums[i]==nums[i-])
continue; // 去重
for(int j=i+;j<nums.size()-;j++)
{
if(j>i+ && nums[j]==nums[j-])
continue; // 去重
int l=j+;
int r=nums.size()-;
while(l<r)
{
if(nums[i]+nums[j]+nums[l]+nums[r]<target)
while(l<r && nums[l]==nums[++l]); // 去重
else if(nums[i]+nums[j]+nums[l]+nums[r]>target)
while(l<r && nums[r]==nums[--r]);
else
{
vector<int> temp{nums[i],nums[j],nums[l],nums[r]};
res.push_back(temp);
while(l<r && nums[l]==nums[++l]);
while(l<r && nums[r]==nums[--r]);
}
}
}
}
return res;
}
};
【LeetCode】四数之和的更多相关文章
- leetcode 四数之和
这里我们可以考虑将 n 数之和降低为一个数加上 n-1 数之和的问题.依次降低 ,最低是二数之和的问题 ,二数之和问题容易解决.主要在于从 n 到 n-1 的过程需要理解 :下列代码中前几个 if 是 ...
- [LeetCode] 454. 4Sum II 四数之和II
Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such t ...
- LeetCode:四数之和【18】
LeetCode:四数之和[18] 题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c ...
- 【LeetCode】 454、四数之和 II
题目等级:4Sum II(Medium) 题目描述: Given four lists A, B, C, D of integer values, compute how many tuples (i ...
- LeetCode:两数之和、三数之和、四数之和
LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...
- Java实现 LeetCode 18 四数之和
18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target ...
- 【LeetCode】18. 4Sum 四数之和
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:four sum, 4sum, 四数之和,题解,leet ...
- LeetCode第十八题-四数之和
4Sum 问题简介:定n个整数和整数目标的数组nums,是否有元素a,b,c,d在nums中,使a+b+c+d=target? 举例: 给定数组 nums = [1, 0, -1, 0, -2, 2] ...
- 【LeetCode】18.四数之和
题目描述 18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 t ...
随机推荐
- windows10安装.netframework3.5
先挂载,看看挂载到哪个盘了,假设是I盘 然后按住shift 点鼠标右键,打开powershell,运行下面命令: dism.exe /online /enable-feature /featurena ...
- android:showAsAction
在res/layout/menu文件夹下,放置login.xml: <menu xmlns:android="http://schemas.android.com/apk/res/an ...
- 关于c++ 感想
前言 在学校开展了c++的课程,但是不得不说相当乏味. 原因很简单: 1.感觉c++很高级,自己就这智商怎么学的会哦,自己给了自己门槛. 2.c++很难快速的做出一个能够展现的项目,缺乏成就感. 3. ...
- 「UVA10559」Blocks
传送门 Luogu 解题思路 考虑区间 \(\text{DP}\). 设 \(f[i][j][k]\) 表示 \([i,j]\) 这段区间接上后面 \(k\) 个与 \(j\) 颜色相同的块得到的答案 ...
- Mongo2Go 介绍
Mongo2Go(https://github.com/Mongo2Go/Mongo2Go )是最新的MongoDB二进制文件的托管包装, 它针对.NET Standard 1.6(对于.NET 4. ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:分割按钮
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- zabbix java gateway配置实战案例
zabbix java gateway配置实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.部署tomcat服务 博主推荐阅读: CentOS: https://www. ...
- 快速为Eclipse配置PyDev插件
想学习Python,查询网络之后发现PyDev是很好的插件,所以就想为Eclipse配置它.结果在整个配置的过程中出现了各种问题,版本问题,重复问题,反正乱七八糟的,本身安装一次的时间就很长,中间出现 ...
- 2-10 就业课(2.0)-oozie:8、定时任务的执行
4.5.oozie的任务调度,定时任务执行 在oozie当中,主要是通过Coordinator 来实现任务的定时调度,与我们的workflow类似的,Coordinator 这个模块也是主要通过xml ...
- java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with specified [javax.transaction.TransactionManager] required
错误信息: java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA trans ...