-----QUESTION-----
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less thanindex2. Please note that your returned answers (both index1 andindex2) are not zero-based.
You may assume that each input would have exactly one solution.
Input:
Output:
-----SOLUTION-----
class Solution {
public:
struct pai{
int data;
int idx;
bool operator< (const pai& rhs) const{
return data < rhs.data;
}
int operator+ (const pai& rhs) const{
return data + rhs.data;
}
};
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> result;
vector<pai> data(numbers.size());
for(int i = 0; i < numbers.size(); i++)
{
data[i].data = numbers[i];
data[i].idx = i+1;
}
sort(data.begin(),data.end());
int i = 0; //position of the first number
int j = numbers.size()-1; //position of the second number
while(i<j)
{
if(data[i]+data[j] == target)
{
result.push_back(min(data[i].idx,data[j].idx));
result.push_back(max(data[i].idx,data[j].idx));
return result;
}
else if(data[i]+data[j] < target) i++;
else j--;
}
}
};
也可以用递归的方法
class Solution {
public:
vector<int> twoSum(vector<int> &num, int target) {
vector<int> result;
dfs(num, 0, 0, target, result);
return result;
}
bool dfs(vector<int> &num, int firstIndex, int depth, int target, vector<int> &result)
{
if(depth == 1)
{
for(int i = firstIndex+1; i < num.size(); i++)
{
if(num[i] == target)
{
result.push_back(firstIndex+1);
result.push_back(i+1);
return true;
}
}
return false;
}
for(int i = firstIndex; i < num.size(); i++)
{
if(dfs(num, i, depth+1, target-num[i], result))
return true;
}
}
};