Leetcode 3 sum && 3 sum closet&& 4 sum
2013-04-13 14:37
387 查看
3 sum
a+b+c=0
3 sum closet
以上代码有问题,二分查找此处中间值不能等于边界值。
4 sum
定义一对指针,指向两头。再定义一对指针,指向中间的两个元素。加起来看看跟target比较一下。再决定内部指针怎么移动
a+b+c=0
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { vector<vector<int> >v; vector<int>v1; sort(num.begin(),num.end()); for(int i=0;i<num.size();i++) { if(num.size()<3)break; if(num[i]>0)break; for(int a=i+1,b=num.size()-1;a<b;) { int sum=num[i]+num[a]+num[b]; if(sum==0) { v1.clear(); v1.push_back(num[i]); v1.push_back(num[a]); v1.push_back(num[b]); if(count(v.begin(),v.end(),v1)==0) v.push_back(v1); a++;b--; } if(sum<0) { a++; } if(sum>0){b--;} } } return v; } };
3 sum closet
class Solution { public: int threeSumClosest(vector<int> &num, int target) { int n=num.size(); assert(n>=3); sort(num.begin(),num.end()); int value; int sum=num[0]+num[1]+num[2]; int diff=abs(sum-target); int temp=sum; for(int i=0;i<n-2;i++) { int a=i; int b=n-1; int m; value = target-num[a]-num[b]; while(a<b) { m=a+(b-a)/2; if(value==num[m])return target; if(abs(num[m]-value)<diff) { diff=abs(num[m]-value); temp=target-value+num[m]; } if(num[m]>value) { b=m-1; } else { a=m+1; } } } return temp; } };
以上代码有问题,二分查找此处中间值不能等于边界值。
class Solution { public: int threeSumClosest(vector<int> &num, int target) { int n=num.size(); assert(n>=3); sort(num.begin(),num.end()); int value; int sum=num[0]+num[1]+num[2]; int diff=abs(sum-target); int temp=sum; int i=0,j=n-1; while(i<n-2&&j>1&&i<j-1) { int a=i; int b=j; int m; value = target-num[a]-num[b]; while(a<b-1) { m=a+(b-a)/2; if(value==num[m])return target; if(abs(num[m]-value)<diff) { diff=abs(num[m]-value); temp=target-value+num[m]; } if(num[m]>value) { b=m; } else { a=m; } } if(value<0)j--; else if(value>0) i++; else if(value==0&&num[m]>0)j--; else i++; } return temp; } };
4 sum
定义一对指针,指向两头。再定义一对指针,指向中间的两个元素。加起来看看跟target比较一下。再决定内部指针怎么移动
class Solution { public: vector<vector<int> > fourSum(vector<int> &num, int target) { vector<int>v; vector<vector<int>>v1; int len=num.size(); if(len<=3)return v1; sort(num.begin(),num.end()); for(int i=0;i<len-3;i++) { for(int k=len-1;k>i+2;k--) { int ab=num[i]+num[k]; int c=target-ab; int m=i+1,n=k-1; for(;m<n;) { int sum=num[m]+num ; if(sum==c) { v.clear(); v.push_back(num[i]); v.push_back(num[m]); v.push_back(num ); v.push_back(num[k]); if(count(v1.begin(),v1.end(),v)==0) v1.push_back(v); m++;n--; } else if(sum<c) { m++; } else n--; } } } return v1; } };
相关文章推荐
- 【C++】【LeetCode】39. Combination Sum&40. Combination Sum II
- 【leetcode】Path Sum I & II(middle)
- [*leetcode 39] Combination Sum && [*leetcode 40] Combination Sum II
- Leetcode StringSum & LinkList Sum
- LeetCode - Combination Sum I && II
- leetcode题解-40. Combination Sum II && 216. Combination Sum III
- LeetCode 39. Combination Sum && 40. Combination Sum II && 216. Combination Sum III
- [Leetcode] #39#40#216 Combination Sum I & II & III
- leetcode Unique Paths & Unique Paths II & Minimum Path Sum
- LeetCode | Combination Sum & II & III
- 【leetcode】1. Two Sum(Python & C++)
- Leetcode 339. Nested List Weight Sum & 364. Nested List Weight Sum II
- Leetcode 303. Range Sum Query - Immutable & 307. Range Sum Query - Mutable
- LeetCode-494. Target Sum(DFS&DP)
- LeetCode解题报告—— Sum Root to Leaf Numbers & Surrounded Regions & Single Number II
- [LeetCode] 2Sum, 3Sum, 4Sum, 3SUm closet
- LeetCode 1 : Two Sum ---- 哈希&数组
- LeetCode-Path Sum II<ERROR>
- LeetCode | Unique Paths & II & Minimum Path Sum
- leetcode Combination Sum &Combination Sum II