目的

旨在记录在Leedcode网上刷题的过程,记录心得。

题目

给定一个包含 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]
]

思路

思路1:

暴力遍历法,依次遍历4重数组,求4者的和与target作比较,判断4元组是否在结果组里面,若不在,则加进去。

思路2:

参考大神的思路:采用降和的方法。将4和降为3和,3和降为2和来求。

代码

class Solution {
public://思路1vector<vector<int>> fourSum1(vector<int>& nums, int target) {int numsize = nums.size();vector<vector<int>> results;if(numsize<4) return results;vector<int> result;for(int i=0;i<numsize;i++){for(int j=i+1;j<numsize;j++){for(int k=j+1;k<numsize;k++){for(int l=k+1;l<numsize;l++){int sum = nums[i]+nums[j]+nums[k]+nums[l];if(sum == target){result.push_back(nums[i]);result.push_back(nums[j]);result.push_back(nums[k]);result.push_back(nums[l]);sort(result.begin(),result.end());\//若元素不在results里面,则放进resultsif(find(results.begin(), results.end(), result) == results.end())results.push_back(result);result.clear();}}}}}return results;}//思路2vector<vector<int>> fourSum2(vector<int>& nums, int target) {vector<vector<int>> res;sort(nums.begin(), nums.end());   //首先排序if (nums.empty()) return {};for(int z = 0; z < nums.size(); z ++){if (z > 0 && nums[z] == nums[z - 1]) continue;int newTarget = target - nums[z];   // 将四数之和转化为3数for(int k = z+1; k < nums.size(); k++){   // 三数变成两数if(k > z+1 && nums[k] == nums[k - 1]) continue;int newTarget2 = newTarget - nums[k];int i = k + 1, j = nums.size() - 1;while (i < j) {              // 两数之和if (nums[i] + nums[j] == newTarget2) {res.push_back({nums[z], nums[k], nums[i], nums[j]});while (i < j && nums[i] == nums[i + 1]) ++i;   //注意去重while (i < j && nums[j] == nums[j - 1]) --j;++i; --j;} else if (nums[i] + nums[j] < newTarget2) ++i;else --j;}}}return res;}
};

效果

思路1效果

思路2效果

Leedcode编程题18: 四数之和----C++实现相关推荐

  1. 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和

    代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...

  2. (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和

    代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...

  3. 代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30

    代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30 454.四数相加II 可以先用2次for循环遍历前两个数组a,b 并存储到map ...

  4. 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

    Leetcode 454.四数相加II 题目链接 思路:求四数相加之和,将四数两两相加,判断两两相加的数是否和为0 定义一个map,key放两数之和,value放两数之和出现的次数 两层for循环将前 ...

  5. 代码随想录算法训练营day7| 454.四数相加II,383. 赎金信 ,15. 三数之和,18. 四数之和

    454.四数相加II 454. 四数相加 II 四个数在不同的数组里,不用考虑重复的问题 先计算2个数的和,并且统计和出现的次数,在用目标值减去后面两个数的和,用find查找是否存在减去后的数字. c ...

  6. 代码随想录算法训练营第6天 | 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和

    一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...

  7. 代码随想录算法训练营第七天 | 454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和

    454. 四数相加 II 题解及想法 通过两个for循环先遍历a和b,key放a和b两数之和,value 放a和b两数之和出现的次数,再通过两个for循环遍历c和d,如果0-(c+d) 在map中出现 ...

  8. 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

  9. 代码随想录算法训练营第四期第六天| 454.四数相加II、383.赎金信、15.三数之和、18. 四数之和

    454.四数相加II 给你四个整数数组nums1.nums2.nums3和nums4 ,数组长度都是n ,请你计算有多少个元组(i, j, k, l)能满足: 0 <= i, j, k, l & ...

  10. 代码随想录算法训练营15期 Day 7 | 454.四数相加II 、 383. 赎金信 、15. 三数之和 、18. 四数之和

    昨天看了一下别的东西,导致昨天没有练习打卡,今天补上昨天的学习知识. 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使 ...

最新文章

  1. 我用Java+SeimiCrawler+Redis+ES+Kibana技术对数百万知乎用户进行了数据分析,得到了这些......
  2. Streaming源码解读之接收流数据的全生命周期
  3. xcode 中的iOS模拟器,home键快捷键
  4. python int函数详解,python int()函数
  5. Java Spring初学者之调试器里括号包含的类含义
  6. 获取数据 - 下载附件解压附件 - Python代码
  7. python3基础知识二
  8. LINUX内核下跑单片机按键,S3C2440下linux按键驱动编写及测试程序
  9. Kali Linux 从入门到精通(十)-漏洞挖掘之缓冲区溢出
  10. 最完整的MySQL规范
  11. python连载第11篇 if 语句
  12. 我应该做哪个行业的销售
  13. UGUI 在面板经常使用的表格布局制作
  14. 10.第十一章.风险管理
  15. 【HTML】一个index.html文件,完成三码合一,完成万能打赏码
  16. 波特率传输字节数计算方法
  17. 2021年企业商务网站建设必须安装的24个WordPress插件
  18. 2022 CCF中国软件大会(CCF Chinasoft)“软件可信性与供应链安全前沿进展”论坛成功召开...
  19. 银行卡号码校验算法(Luhn算法,又叫模10算法)
  20. 物联网中使用了哪些技术?

热门文章

  1. linux 课程标准,《Linux操作系统及应用》课程标准.doc
  2. 什么是反向 DNS?使用场景是什么?如何反向DNS查找,怎样配置?
  3. 基础知识贴----用好用活N93(完)
  4. pandas读取excel数据并对重复数据进行标记或者删除
  5. win 10 输入法自定义切换快捷键(rime)
  6. 算法:一个长字符串中含多个连续和不连续的空格,求不含空格的最长字符串长度
  7. jzoj 3837 心灵终结
  8. linux的iso镜像文件,linux系统安装iso文件方法
  9. python爬虫实践篇--------飞猪网站资料爬取
  10. 千万不要死于无知——心理状态