您的位置:首页 > 其它

[LeetCode]Two Sum

2014-07-23 18:33 295 查看
思路:
最直接的方式用两个for循环枚举所有的情况,时间复杂度O(n^2),超时,需要优化。提供两种方法(都需要提前排序):1)先排序,固定一个数a,在剩下的数中二分查找b满足条件(a+b=target),复杂度O(nlogn);2)先排序,用两个指针
i 和 j(一个指向头,一个指向尾),比较num[i]+num[j]与target的大小,如果前者小,则 i++;前者大,则 j--;相等或 i==j 结束。
代码:
Accepted 1:

struct node
{
int n,iid;
}num[10000000];
bool cmp(node x,node y)
{
return x.n<y.n;
}
class Solution {
public:
vector<int> twoSum(vector<int> numbers, int target)
{
int l=numbers.size();
int res1,res2;
int i,j;
vector<int> cnt;
for(i=0;i<l;i++)
{
num[i].n=numbers[i];
num[i].iid=i+1;
}
sort(num,num+l,cmp);
for(i=0;i<l;i++)
{
int d=target-num[i].n;
int t=i+1,r=l-1,mid;
while(t<=r)
{
mid=(t+r)/2;
if(num[mid].n>d)
r=mid-1;
else if(num[mid].n<d)
t=mid+1;
else
{
res1=num[i].iid;
res2=num[mid].iid;
break;
}
}
}
cnt.push_back(min(res1,res2));
cnt.push_back(max(res1,res2));
return cnt;
}
};


Accepted 2:

struct node
{
int id,n;
}num[100000];
bool cmp(node a,node b)
{
return a.n<b.n;
}
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
int len=numbers.size();
int i,j;
vector<int> cnt;
for(i=0;i<len;i++)
{
num[i].n=numbers[i];
num[i].id=i+1;
}
sort(num,num+len,cmp);
i=0,j=len-1;
while(i<j)
{
int ans=num[i].n+num[j].n;
if(ans<target)
i++;
else if(ans>target)
j--;
else
break;
}
cnt.push_back(min(num[i].id,num[j].id));
cnt.push_back(max(num[i].id,num[j].id));
return cnt;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: