3Sum 3Sum Closest 4Sum
来源:互联网 发布:递归算法流程图 编辑:程序博客网 时间:2024/04/24 20:57
难度:3
3Sum的题意:
给出一列数,找出所有的满足条件的三个数,条件:三个数相加等于0
3Sum Closest 的题意:
给出一列数,找出三个数使得三个数相加最接近target
4Sum:
和3sum一样,不过是4个数
解法:
都一样。。基本改几行就能过另外两个题
3Sum的解法:
按从小到大排序
假设找到的三个数a,b,c满足
a+b+c=0
a<=b<=c
从左往右枚举a,在[a+1,n]中寻找b和c使得b+c==-a
初始令b=a+1,c=n
当b+c<-a时,为增大b+c,应使得b右移
当b+c>-a时,为减小b+c,应使得c左移
当b+c=a时,记录结果
O(n^2)
3Sum
class Solution{public: vector< vector<int> > threeSum(vector<int> &num) { vector< vector<int> > ans; sort(num.begin(),num.end()); for(int i=0;i<num.size();i++) { if(i-1>=0&&num[i] == num[i-1])//如果num[i]等于num[i-1]则结果必定已被包含 { continue; } //j,k,num[j]+num[k]=-num[i] int j=i+1; int k=num.size()-1; while(j<num.size()&&k>i&&j<k) { if(num[j]+num[k]>-num[i]) k--; else if(num[j]+num[k]<-num[i]) j++; else { vector<int>tmp; tmp.push_back(num[i]); tmp.push_back(num[j]); tmp.push_back(num[k]); if(ans.size()>=1&&ans[ans.size()-1][0] == num[i]&&ans[ans.size()-1][1] == num[j]&&ans[ans.size()-1][2] == num[k]) { j++; continue; } ans.push_back(tmp); j++; } } } return ans; }};3Sum Closest
class Solution{public: int threeSumClosest(vector<int> &num, int target) { int ans=0x3fffffff; sort(num.begin(),num.end()); for(int i=0;i<num.size();i++) { if(i-1>=0&&num[i] == num[i-1])//如果num[i]等于num[i-1]则结果必定已被包含 { continue; } //j,k,num[i]+num[j]+num[k]=target int j=i+1; int k=num.size()-1; while(j<num.size()&&k>i&&j<k) { if(num[i]+num[j]+num[k]>target) { if(num[i]+num[j]+num[k]-target<abs(ans-target)) { ans=num[i]+num[j]+num[k]; } k--; } else if(num[i]+num[j]+num[k]<target) { if(target-num[i]-num[j]-num[k]<abs(ans-target)) { ans=num[i]+num[j]+num[k]; } j++; } else { return target; } } } return ans; }};
4Sum
class Solution{public: vector<vector<int> > fourSum(vector<int> &num, int target) { sort(num.begin(),num.end()); vector<vector<int> > ans; for(int i=0;i<num.size();i++) { if(i>=1&&num[i] == num[i-1]) { continue; } for(int j=i+1;j<num.size();j++) { if(j-1>=i+1&&num[j] == num[j-1]) { continue; } int k=j+1; int l=num.size()-1; while(k<l&&k<num.size()) { if(num[i]+num[j]+num[k]+num[l] > target) l--; else if(num[i]+num[j]+num[k]+num[l] < target) k++; else { if(ans.size()>0&&ans[ans.size()-1][0] == num[i]&&ans[ans.size()-1][1] == num[j]&&ans[ans.size()-1][2] == num[k]&&ans[ans.size()-1][3] == num[l]) { k++; continue; } vector<int>tmp; tmp.push_back(num[i]); tmp.push_back(num[j]); tmp.push_back(num[k]); tmp.push_back(num[l]); ans.push_back(tmp); k++; } } } } return ans; }};
- 3Sum 3Sum Closest 4Sum
- 3Sum & 3Sum Closest & 4Sum
- 3Sum, 3Sum Closest, 4 Sum
- Two Sum & 3Sum & 3Sum Closest & 4Sum
- Two Sum,3Sum,3Sum Closest,4Sum
- leetcode 3sum closest && 4sum
- 3 Sum & 3 Sum Closest
- 【Leetcode】3Sum Closest (Sum)
- 【LeetCode】3Sum && 3Sum Closest && 4Sum
- leetcode 3Sum 3Sum Closest 4Sum
- LeetCode OJ - 3Sum、3Sum Closest、4Sum
- LeetCode 3Sum&&3Sum Closest&&4Sum
- LeetCode:3Sum, 3Sum Closest, 4Sum
- 【leetcode X Sum 系列】Two Sum|3Sum|3Sum Closest|4Sum
- LeetCode: 3 Sum Closest
- 3Sum Closest
- leetcode - 3 sum closest
- leetcode 3Sum Closest
- Google C++编程规范:(二)作用域
- PHP基础知识
- IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统) .
- Unity3D 游戏引擎之角色控制器组件研究
- Grails框架优劣势分析及同类比较
- 3Sum 3Sum Closest 4Sum
- C#中导入Win32 API函数
- NGUI学习之Progress Bar
- redis主从配置文件
- 2014阿里巴巴校园招聘笔试题(中南站)
- linux下mysql 最新版安装图解教程
- ubuntu12.04Android源码下载
- Unity3D之Lightmap详解
- Difference between save vs persist and saveOrUpdate in Hibernate