LeetCode 18. 四数之和(4Sum)
题目描述
给定一个包含 n 个整数的数组 nums
和一个目标值 target
,判断 nums
中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target
相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
- 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
- 满足要求的四元组集合为:
- [
- [-1, 0, 0, 1],
- [-2, -1, 1, 2],
- [-2, 0, 0, 2]
- ]
解题思路
借鉴三数之和的思路,首先将数组从大到小排序,然后从数组首位置开始遍历:
- 固定第一个数,将其加入结果集合,为了避免重复,若该数与前一个数相同则跳过
- 接着固定第二个数为第一个数的下一个位置,将其加入结果集合,同样为了避免重复,若该数与前一个数相同则跳过
- 用双指针法,左右指针分别指向第二个数的下一个位置和最后一个位置,算出两数的目标和,若两位置的数之和正好等于目标,则加入到结果集合中,并将左指针指向右边第一个与当前数不相同的位置,同时右指针向左移动一位;若两位置的数之和小于目标,则将左指针向右移动一位;若两位置的数之和大于目标,则将右指针向左移动一位。这样移动直到左指针超过右指针或与其相遇
- 根据回溯法的思想,遍历完第一个数和第二个数的解之后,分别将其弹出结果集合
代码
- class Solution {
- public:
- vector<vector<int>> fourSum(vector<int>& nums, int target) {
- sort(nums.begin(), nums.end());
- vector<vector<int>> res;
- vector<int> temp;
- int size = nums.size();
- for(int i = ; i < size - ; i++){
- if(i && nums[i] == nums[i - ]) continue;
- int sum3 = target - nums[i];
- temp.push_back(nums[i]);
- for(int j = i + ; j < size - ; j++){
- if(j != i + && nums[j] == nums[j - ]) continue;
- int sum2 = sum3 - nums[j];
- temp.push_back(nums[j]);
- int left = j + , right = size - ;
- while(left < right){
- if(nums[left] + nums[right] == sum2){
- temp.push_back(nums[left]);
- temp.push_back(nums[right]);
- res.push_back(temp);
- temp.pop_back();
- temp.pop_back();
- left++;
- while(nums[left] == nums[left - ]) left++;
- right--;
- }
- else if(nums[left] + nums[right] < sum2)
- left++;
- else right--;
- }
- temp.pop_back();
- }
- temp.pop_back();
- }
- return res;
- }
- };
LeetCode 18. 四数之和(4Sum)的更多相关文章
- Java实现 LeetCode 18 四数之和
18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target ...
- [Leetcode 18]四数之和 4 Sum
[题目] Given an array nums of n integers and an integer target, are there elements a, b, c, and d in n ...
- [LeetCode] 18. 四数之和
题目链接:https://leetcode-cn.com/problems/4sum/ 题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个 ...
- LeetCode:四数之和【18】
LeetCode:四数之和[18] 题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c ...
- 【LeetCode】18.四数之和
题目描述 18. 四数之和 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 t ...
- 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和
第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...
- 【LeetCode】四数之和
[问题]给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找 ...
- 【LeetCode】四数之和【排序,固定k1,k2,二分寻找k3和k4】
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...
- [Swift]LeetCode18. 四数之和 | 4Sum
Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...
随机推荐
- Css常用的技巧
一.使用css缩写 使用缩写可以帮助减少你CSS文件的大小,更加容易阅读. 具体内容请浏览:CSS常用缩写语法 二.明确定义单位,除非值为0. 忘记定义尺寸的单位是CSS新手普遍的错误.在HTML中 ...
- mysql架构总结
1.单机架构模式,多用于测试,实际生产中需优化: 2.一主多从,主数据库读和写,从数据库从主数据库同步,仅负责读,可解决一定访问量的需求: 3.MHA(Master High Availability ...
- git 常用命令语句(个人笔记)
切换账户 git config user.name xxxxx 查看用户名 ex: git config user.name tongjiaojiao git config user.e ...
- 上海的Costco,谈谈你的理解和感受
众所周知,Costco在上海第一天开业,由于人流量过大,一度暂停营业.我觉得Costco的成功在于不走寻常路,换位思考(站在用户.厂商角度看问题),下面几点是我觉得它做得比较独特的地方: 1. Cos ...
- python 目录管理与文件管理
目录管理(os) system:执行系统命令 # 执行系统命令 os.system('cls') name:获取操作系统名称 # 操作系统名称,nt代表Windows, posix代表类unix pr ...
- 企业QQ在线咨询接入
普通QQ在线咨询接入 http://wpa.qq.com/msgrd?v=3&uin=4009603616&site=qq&menu=yes; 企业QQ在线咨询接入 ...
- appium 自动化测试环境搭建
最近再学习appium,把学习的过程记录下来,以防止到时候 换个电脑就不知道这么安装搭建appium环境了. 环境搭建: 0.JDK环境是必备的,这里大家自行百度, 1.安装 node 环境,前辈 ...
- init container
init container与应用容器在本质上是一样的, 但它们是仅运行一次就结束的任务, 并且必须在成功执行完成后, 系统才能继续执行下一个容器, 可以用在例如应用容器启动前做一些初始化工作,当in ...
- C#制作的屏幕取色器
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System ...
- 自定义Vue组件
自定义Vue组件的三步骤 1.创建组件 2.注册组件 3.使用组件 创建组件 //创建组件 var myclock = { data(){ return { clock: new Date().toL ...