一、问题描述

  给定一个数组S,和一个int类型的数target,在S中寻找四个数,这四个数之和为target。返回一个vector<vector<int>>

  例子:S={1, 0, -1, 0, -2, 2},target = 0.返回结果为{{-1,0,0,1},{-2,1,1,2},{-2,0,0,2}}

二、问题解决

  最简单的思路是四层循环,这样不管是之前的3之和问题还是4之和问题都能解决,缺点就是比较费时,在leetcode上提交还可能超时。

  更好一点的方式是对数组进行排序之后,从两边逼近的方式。这样可以减少一层循环,3数之和就先确定一个数,4数之和就先确定两个数。本题下面的解法之中,固定i和j,让k和l冲两边逼近。

  这题比较麻烦的是去重复。

vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;if (nums.size() < 4) return result;sort(nums.begin(),nums.end());/*for (auto o : nums)cout << o;cout << endl;*/for (int i = 0; i < nums.size() - 3; i++) {     //去除重复while (i != 0  && nums.at(i - 1) == nums.at(i))i++;for (int j = i + 1; j < nums.size() - 2; j++) {       //去除重复while (j != i + 1 && j+1 <nums.size()-1&& nums.at(j-1) == nums.at(j))j++;int k = j + 1, l = nums.size()-1;while (k < l) {//cout << i << j << k << l << endl;if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) == target) {vector<int> temp;temp.emplace_back(nums.at(i));temp.emplace_back(nums.at(j));temp.emplace_back(nums.at(k));temp.emplace_back(nums.at(l));result.emplace_back(temp);            //去除重复while (k + 1 < l && nums.at(k) == nums.at(k + 1))k++;while (l-1 > k && nums.at(l) == nums.at(l - 1))l--;k++;}if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) > target)l--;if (nums.at(i) + nums.at(j) + nums.at(k) + nums.at(l) < target)k++;}}}//result.erase(unique(result.begin(), result.end()),result.end());return result;
}

转载于:https://www.cnblogs.com/likaiming/p/8280311.html

LeetCode-18-4Sum相关推荐

  1. leetcode 18 -- 4Sum

    4Sum 题目:Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + ...

  2. leetcode 18 --- 4sum

    1  题目 给出一个有n个元素的数组S,S中是否有元素a,b,c和d满足a+b+c+d=目标值?找出数组S中所有满足条件的四元组. 注意: 四元组(a.b.c.d)中的元素必须按非降序排列.(即a≤b ...

  3. LeetCode 454 4Sum II(哈希法)

    问题:给出四个数组A,B,C,D,问有多少组(i,j,k,l)满足A[i]+B[j]+C[k]+D[l]=0 思路:如果直接数据遍历,时间复杂度为O(n^4).可以考虑降维.先计算A,B遍历求对应和与 ...

  4. LeetCode 18 四数之和

    https://leetcode-cn.com/problems/4sum/ 解决方案 class Solution {public List<List<Integer>> f ...

  5. leetcode 454. 4Sum II | 454. 四数相加 II(Java)

    题目 https://leetcode.com/problems/4sum-ii/ 题解 四数相加问题. 对于左边两个数两两组合,需要维护一个 map,用来存左边两个数的 sum 以及该 sum 对应 ...

  6. 18 4Sum(寻找四个数之和为指定数的集合Medium)

    题目意思:给一个乱序数组,在里面寻找三个数之和为target的所有情况,这些情况不能重复,增序排列 思路:采用3Sum的做法 ps:有见一种用hash的,存任意两个元素的和,然后变成3sum问题,需要 ...

  7. LeetCode 454. 4Sum II

    454. 4Sum II Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) the ...

  8. LeetCode 18. 早餐组合

    LCP 18. 早餐组合 小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格.小扣的计划选择一份主食和一款饮料,且 ...

  9. 4. Leetcode 18. 四数之和 (数组-双向双指针)

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] ( ...

  10. Leetcode 18. 四数之和 (每日一题 20211011)

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] : ...

最新文章

  1. 两张照片重叠处半透明_全面解读超焦距,让你的风景照片更锐更清晰
  2. github创建项目,并提交本地文件
  3. ios平台下的DES加密
  4. 【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
  5. 24小时临时邮箱_实用网站 | 临时邮箱,悄悄来悄悄去~
  6. Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
  7. duilib消息事件产生和分发解释
  8. 每天中一次500万彩票,谷歌CEO 2019薪酬曝光,总计2.81亿美元
  9. mysql optimize 参数查看_Mysql High Performance:Optimize Setting
  10. (27)System Verilog多个线程间通信(队列)
  11. An Useful Page Mockup Tools – Balsamiq Mockups
  12. 家庭亲戚关系计算器微信小程序源码
  13. 华硕主板装系统蓝屏_装xp系统蓝屏,电脑安装xp系统蓝屏怎么办
  14. C#表达式目录树系列之5 –动态创建查询表达式
  15. QT自定义控件之车辆远近光灯
  16. (83)FPGA减法器设计(多位减法器)
  17. python五分制转分数档_五分制绩点换算四分制(5.0绩点计算器在线)
  18. 【Java】Java零基础学习笔记
  19. 2009-2010年中国十大平面设计公司排名
  20. 马里兰大学计算机世界排名,2019上海软科世界一流学科排名计算机科学与工程专业排名马里兰大学帕克分校排名第38...

热门文章

  1. 【NOI2014】起床困难综合症 贪心
  2. 手机相机自动识别语音提示
  3. sqldeveloper的查看执行计划快捷键F10
  4. jvm感知docker容器参数
  5. 020-Spring Boot 监控和度量
  6. cmail服务器安装后无法登录的解决办法
  7. Cocos2d-x 3.0 简捷的物理引擎
  8. mysql主从复制 lvs+ keepalived
  9. 关闭子窗口 父窗口自动刷新
  10. android开发(13) 尝试在流布局中移动控件