Two Sum
2013-11-23 14:43
169 查看
注释的部分是普通解法o(n^2)
排序使数组是有序的,O(nlgn)的时间复杂度(注意用到了快排!)就可以解决了,此题注意小标即可!指针从俩边向中间靠拢!
第二次:此题在编程之美有,第一思路是用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>();
}
};
排序使数组是有序的,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>();
}
};
相关文章推荐
- [Leetcode] Two Sum
- LeetCode_Two Sum
- Two Sum
- leetcode - Two Sum
- 【Leetcode】Two Sum
- Two Sum
- two sum(from leedcode)----map和哈希表
- [LeetCode] Two Sum
- LeetCode——Two Sum
- [LeetCode] Two Sum
- leetcode——Two Sum 两数之和(AC)
- Two Sum
- two sum
- Two Sum
- Two Sum
- LeetCode-Two Sum-找和等于某个数的两个数-二分查找
- leetcode Two Sum
- LeetCode-Two Sum
- leetCode Two Sum
- Two Sum