题目地址:http://leetcode.com/onlinejudge
题意:给定一个数组和一个目标值,在数组中找到两个数相加为目标值。
思路:1,最容易想到的就是暴力法。利用两个for循环遍历得到。时间复杂度为O(n2)。
2,先对数组排序,然后利用两个指针first和last指向头和尾,如果所指的值相加小于目标值就将first加1,否则的话将last减 1。直到first大于last的时候停止。
代码实现:
struct SLNode
{
int val;
int id;
SLNode(){}
SLNode(int x,int order) : val(x), id(order){}
};
bool compare(SLNode a, SLNode b)
{
return a.val < b.val;
}
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<SLNode> result;
vector<int> ans;
SLNode *p = NULL;
for(int i = 0; i < numbers.size(); ++i)
{
p = new SLNode(numbers[i], i + 1);
result.push_back(*p);
}
sort(result.begin(), result.end(), compare);
int i = 0, j = numbers.size() - 1;
while(true)
{
if(result[i].val + result[j].val == target)
{
if(result[i].id > result[j].id)
{
ans.push_back(result[j].id);
ans.push_back(result[i].id);
}
else
{
ans.push_back(result[i].id);
ans.push_back(result[j].id);
}
break;
}
else if(result[i].val + result[j].val > target)
j--;
else
i++;
}
return ans;
}
};