您的位置:首页 > 其它

Two Sum

2013-11-23 14:43 169 查看
注释的部分是普通解法o(n^2)

排序使数组是有序的,O(nlgn)的时间复杂度(注意用到了快排!)就可以解决了,此题注意小标即可!指针从俩边向中间靠拢!

#include<algorithm>

struct num_type
{
int val;
int pos;
};

bool cmp(num_type a,num_type b)
{
return a.val < b.val;
}

class Solution {
public:

vector<int> twoSum(vector<int> &numbers, int target)
{
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
/*
vector<int> index;
for(vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++ it)
{
for(vector<int>::iterator second = it+1; second != numbers.end(); ++ second)
{

if ((*it + *second) == target)
{
index.push_back(it-numbers.begin()+1);
index.push_back(second-numbers.begin()+1);
}
}
}
return index;
*/

vector<int> index;
vector<num_type> sort_numbers;
int sum;
for (vector<int>::iterator it = numbers.begin();it != numbers.end();it++)
{
num_type temp;
temp.val = *it;
temp.pos = it-numbers.begin();
sort_numbers.push_back(temp);
}

sort(sort_numbers.begin(),sort_numbers.end(),cmp);//排序

vector<num_type>::iterator begin_pos,end_pos;
begin_pos = sort_numbers.begin();
end_pos = sort_numbers.end()-1;//下标要注意!
while(begin_pos != end_pos)
{
sum = (*begin_pos).val + (*end_pos).val;

if (sum == target)
{
if ((*begin_pos).pos < (*end_pos).pos)
{
index.push_back((*begin_pos).pos+1);
index.push_back((*end_pos).pos+1);
}
else
{
index.push_back((*end_pos).pos+1);
index.push_back((*begin_pos).pos+1);
}

break;

}
else if (sum < target)//以下为首位指针向俩边靠拢!
{
begin_pos++;
}
else
{
end_pos--;
}

}
return index;

}
};

第二次:此题在编程之美有,第一思路是用hash_map 来做(已知第一个,查第二个很快)。但是由于hash_map 是扩展的STL非标准,在vs2008 使用时需加上 using namespacce stdext;  vs2008 其功能较完善,测试了下支持string,不用自己自定义!

此处用的排序,再用双端指针,向中间夹逼!

class Solution {

struct data_t
{
int val;
int pos;
};
struct cmp_t
{
bool operator()(data_t t1,data_t t2)
{
return t1.val < t2.val;
}
};

public:
vector<int> twoSum(vector<int> &numbers, int target)
{
if(numbers.size()<2) return vector<int>();

vector<data_t> data(numbers.size());
for(int i = 0;i < numbers.size();i++)
{
data[i].val = numbers[i];
data[i].pos = i+1;
}

sort(data.begin(),data.end(),cmp_t());

int left = 0;
int right = numbers.size()-1;
int sum = 0;
vector<int> res(2);

while(left < right)
{
sum = data[left].val + data[right].val;
if(sum == target)
{
if(data[left].pos > data[right].pos )
{
res[0] = data[right].pos;
res[1] = data[left].pos;
}
else
{
res[0] = data[left].pos;
res[1] = data[right].pos;
}
return res;
}
else if(sum < target)
{
left++;
}
else
{
right--;
}
}

return vector<int>();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: