【leetcode】15.3sum 两种解法总结
来源:互联网 发布:转行数据分析师 编辑:程序博客网 时间:2024/06/16 18:16
【方法一】
「思路」
将结果总体分为3种:
1.包含0
a.包含一个0
b.3个都是0
2.两正一负
3.两负一正
按照零正负将数组分为三组,依次两两组合两正之和来查看有没有绝对值相等的负数,两负数同理。最后将返回的vector去重。(注意:两正一负,两负一正在返回结果时要注意三个数字的顺序,否则会影响去重结果)
**「结果」**Runtime: 299 ms
「代码」
vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>>ret; vector<int> ans(3); int n=nums.size(); if(n>0){ int p,z,na; p=z=na=0; int po[n],nage[n]; map<int,int> positive,zero,nagetive; /*分组: 正 0 负*/ for(int i=0;i<n;i++) { if(nums[i]>0) { positive.insert(pair<int, int>(nums[i],p)); po[p]=nums[i]; p++; } else if(nums[i]==0) { zero.insert(pair<int, int>(nums[i],z)); z++; } else { nagetive.insert(pair<int, int>(nums[i],na)); nage[na]=nums[i]; na++; } } /*两负一正*/ if(na>=2) { for(int i=0;i<na-1;i++) { for(int j=i+1;j<na;j++) { if(positive.count(abs(nage[i]+nage[j]))) { ans[2]=abs(nage[i]+nage[j]); if(nage[j]>nage[i]) { ans[0]=nage[i]; ans[1]=nage[j]; } else { ans[0]=nage[j]; ans[1]=nage[i]; } ret.push_back(ans); } } } } /*两正一负*/ if(p>=2) { for(int i=0;i<p-1;i++) { for(int j=i+1;j<p;j++) { if(nagetive.count(-(po[i]+po[j]))) { ans[0]=-(po[i]+po[j]); if(po[j]>po[i]) { ans[1]=po[i]; ans[2]=po[j]; } else { ans[1]=po[j]; ans[2]=po[i]; } ret.push_back(ans); } } } } /*带0*/ if(z>0) { for(int i=0;i<na;i++) { if(positive.count(abs(nage[i]))) { ans[0]=nage[i]; ans[1]=0; ans[2]=abs(nage[i]); ret.push_back(ans); } } if(z>=3) { ans[0]=0; ans[1]=0; ans[2]=0; ret.push_back(ans); } } } sort(ret.begin(),ret.end()); ret.erase(unique(ret.begin(), ret.end()), ret.end()); return ret;}
【方法二】
「思路」
先将nums数组由大到小排序,一次将数组中的每一个数当作目标数,寻找另外两个数字。另外两个数字相加,当结果大时second向左移一个,当结果小时first向右移一个。
「结果」
Runtime: 122 ms
「代码」
vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>>ret; vector<int> ans(3); int n=nums.size(); sort(nums.begin(),nums.end()); for(int i=0;i<n;i++) { int target=-nums[i]; int first=i+1; int second=n-1; while(first<second) { int sum=nums[first]+nums[second]; if(target==sum) { ans[0]=nums[i]; ans[1]=nums[first]; ans[2]=nums[second]; ret.push_back(ans); first++; while(first<second && ans[1]==nums[first]) { first++; } } else if(target<sum) { second--; } else { first++; } } } sort(ret.begin(),ret.end()); ret.erase(unique(ret.begin(), ret.end()), ret.end()); return ret;}
leetcode上时间更短的算法大致思想都和方法二类似,都采用了左右夹击的方式。
阅读全文
0 0
- 【leetcode】15.3sum 两种解法总结
- LeetCode Candy 两种解法
- leetcode:two sum的三种解法
- Gas Station [leetcode] 的两种解法
- Leetcode Group Anagrams两种解法
- LeetCode removeDuplicatesFromSortedArray两种解法方法
- Two Sum Leetcode 解法实现
- 3Sum leetcode解法 分析
- Leetcode:Path Sum 菜鸟解法
- leetcode:two sum 菜鸟解法
- ※ Leetcode - Segment Tree - 307. Range Sum Query - Mutable (线段树+树状数组两种解法以及模板的常见问题解析)
- LeetCode 22:Generate Parentheses的递归,回溯两种解法
- 【LeetCode】46. Permutations 的两种解法及注释、分析
- Leetcode 133. Clone Graph用BFS、DFS两种解法
- leetcode 1. Two Sum 解法讨论
- 39. Combination Sum [leetcode][javascript解法]
- leetcode [Path Sum]//待整理多种解法
- LeetCode Two Sum 之 JavaScript 多种解法
- h5视频播放
- 重建二叉树--已知一个二叉树的前、中序排列,重建出该二叉树。
- DES、AES、RSA等常用加密算法介绍与比较
- Android json数据Log格式化打印
- 评分卡模型开发-基于逻辑回归的标准评分卡实现
- 【leetcode】15.3sum 两种解法总结
- 【转载】《矛盾论》
- ~11
- Hbase原理、基本概念、基本架构
- 关于jvm的几点思考
- UISegmentedControl分段控件(基础篇)
- python爬虫爬取补天公益SRC厂商
- Python内置函数min(iterable, *[, key, default])
- webservice