https://leetcode.com/problems/3sum/

题目:

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
(-1, 0, 1)
(-1, -1, 2)

方法一:

两层循环+二分查找,复杂度O(n^2 logn). 太慢了

 class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
set<vector<int>> res;
vector<vector<int>> output;
vector<int> sol;
sort(nums.begin(),nums.end()); //sort first
int i,j,k,t,x,n=nums.size();
for(i=;i<n;i++){
for(j=i+;j<n-;j++){
t=nums[i]+nums[j];
x=findSol(-t,nums,j+,n-);
if(x!=-){
sol.clear();
sol.push_back(nums[i]);
sol.push_back(nums[j]);
sol.push_back(nums[x]);
res.insert(sol);
}
}
}
set<vector<int>> :: iterator iter;
for(iter=res.begin();iter!=res.end();iter++){
output.push_back(*iter);
}
return output;
}
int findSol(int target,vector<int> nums,int begin,int end){
if(nums[begin]==target)
return begin;
if(nums[end]==target)
return end;
if(nums[begin]>target||nums[end]<target)
return -;
int mid;
while(begin<=end){
mid=(begin+end)/;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target){
end=mid-;
}
else
begin=mid+;
}
return -;
}
};

方法二:  一层循环加two sum思想(https://leetcode.com/problems/two-sum/),O(n^2).

 class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> res;
int i,t,a,b,k,n=nums.size();
for(i=;i<n-;i++){
t=-nums[i];
a=i+;
b=n-;
while(a<b){
k=nums[a]+nums[b];
if(k<t){
a++;
}
else if(k>t){
b--;
}
else{
vector<int> sol(,);
sol[]=nums[i];
sol[]=nums[a];
sol[]=nums[b];
res.push_back(sol);
while (a < b && nums[a] == sol[])
a++;
while (a < b && nums[b] == sol[])
b--;
}
}
while (i + < nums.size() && nums[i + ] == nums[i])
i++;
} //deduplicate, but it is so slow!
//sort(res.begin(), res.end());
//res.erase(unique(res.begin(), res.end()), res.end());
return res;
}
};

最新文章

  1. LISA介绍及其使用方法
  2. BZOJ 1419: Red is good
  3. linux下对date和timestamp的互转
  4. 局域网 其它主机ping不通win7, 解决
  5. POJ 1269 (直线相交) Intersecting Lines
  6. 如何在浏览器网页中实现java小应用程序的功能
  7. [LeetCode179]Largest Number
  8. 【NIO】Java NIO之选择器
  9. 当前页面的url未注册 微信支付
  10. JqGrid 多行表头设置
  11. OpenCV与Qt的环境搭建及Demo
  12. 【小小复习&middot;大米饼】
  13. Apache Commons Beanutils 三 (BeanUtils、ConvertUtils、CollectionUtils...)
  14. 217/219. Contains Duplicate /Contains Duplicate II
  15. jquery-jtemplates.js模板应用
  16. [Windows Azure] Getting Started with Windows Azure SQL Data Sync
  17. (并查集)How Many Tables -- HDU --1213
  18. Django中cookie和session
  19. 团队Alpha冲刺(一)
  20. scala学习5--函数二

热门文章

  1. mybatis foreach Map(String,List)类型
  2. Zabbix实现短信报警设置(实战)
  3. bzoj 2788 [Poi2012]Festival 差分约束+tarjan+floyd
  4. spring mvc处理静态文件
  5. C#:判断当前线程所处状态&amp;委托
  6. react的key值的作用
  7. ASP.NET MVC Identity 使用自己的SQL Server数据库
  8. 我的VIM
  9. CodeChef - RIN Course Selection
  10. Java-ArrayList使用技巧---从第一个List中去除所有第二个List中与之重复的元素