Leedcode编程题18: 四数之和----C++实现
目的
旨在记录在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++实现相关推荐
- 代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和
代码随想录算法训练营第七天| 哈希表理论基础 ,454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体 ...
- (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和
代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...
- 代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30
代码随想录算法训练营第⑦天 | 454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 9.30 454.四数相加II 可以先用2次for循环遍历前两个数组a,b 并存储到map ...
- 代码随想录算法训练营day07| 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
Leetcode 454.四数相加II 题目链接 思路:求四数相加之和,将四数两两相加,判断两两相加的数是否和为0 定义一个map,key放两数之和,value放两数之和出现的次数 两层for循环将前 ...
- 代码随想录算法训练营day7| 454.四数相加II,383. 赎金信 ,15. 三数之和,18. 四数之和
454.四数相加II 454. 四数相加 II 四个数在不同的数组里,不用考虑重复的问题 先计算2个数的和,并且统计和出现的次数,在用目标值减去后面两个数的和,用find查找是否存在减去后的数字. c ...
- 代码随想录算法训练营第6天 | 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
一.Leetcode 454. 四数相加 II 相当于两数相加.但是呢很巧妙的是,卡哥在遍历CD数组时把查哈希表的方法融入了进去.学习一下. 二.Leetcode 383. 赎金信 更简单了,主要是审 ...
- 代码随想录算法训练营第七天 | 454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和
454. 四数相加 II 题解及想法 通过两个for循环先遍历a和b,key放a和b两数之和,value 放a和b两数之和出现的次数,再通过两个for循环遍历c和d,如果0-(c+d) 在map中出现 ...
- 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...
- 代码随想录算法训练营第四期第六天| 454.四数相加II、383.赎金信、15.三数之和、18. 四数之和
454.四数相加II 给你四个整数数组nums1.nums2.nums3和nums4 ,数组长度都是n ,请你计算有多少个元组(i, j, k, l)能满足: 0 <= i, j, k, l & ...
- 代码随想录算法训练营15期 Day 7 | 454.四数相加II 、 383. 赎金信 、15. 三数之和 、18. 四数之和
昨天看了一下别的东西,导致昨天没有练习打卡,今天补上昨天的学习知识. 454.四数相加II 建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使 ...
最新文章
- 我用Java+SeimiCrawler+Redis+ES+Kibana技术对数百万知乎用户进行了数据分析,得到了这些......
- Streaming源码解读之接收流数据的全生命周期
- xcode 中的iOS模拟器,home键快捷键
- python int函数详解,python int()函数
- Java Spring初学者之调试器里括号包含的类含义
- 获取数据 - 下载附件解压附件 - Python代码
- python3基础知识二
- LINUX内核下跑单片机按键,S3C2440下linux按键驱动编写及测试程序
- Kali Linux 从入门到精通(十)-漏洞挖掘之缓冲区溢出
- 最完整的MySQL规范
- python连载第11篇 if 语句
- 我应该做哪个行业的销售
- UGUI 在面板经常使用的表格布局制作
- 10.第十一章.风险管理
- 【HTML】一个index.html文件,完成三码合一,完成万能打赏码
- 波特率传输字节数计算方法
- 2021年企业商务网站建设必须安装的24个WordPress插件
- 2022 CCF中国软件大会(CCF Chinasoft)“软件可信性与供应链安全前沿进展”论坛成功召开...
- 银行卡号码校验算法(Luhn算法,又叫模10算法)
- 物联网中使用了哪些技术?