两数之和
27%
通过
给一个整数数组,找到两个数使得他们的和等于一个给定的数target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是1到n,不是以0开头。
样例
numbers=[2, 7, 11, 15], target=9
return [1, 2]
注意
你可以假设只有一组答案。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决方法1:O(n2)
两层循环,第二层循环看是不是target-num[i]
实现:
vector<int> twoSum(vector<int> &nums, int target) {
// write your code here
vector<int> result(2);
for (size_t i = 0; i < nums.size(); i++)
{
result[0] = i+1;
int j = i + 1;
while (j<nums.size() && nums[j] != target - nums[i] )
j++;
result[1] = j + 1;
if (j != nums.size())
break;
}
return result;
}
解决方案2:O(nlogn)
先排序,然后两个指针一头一尾,看一头一尾和与target相比大小,大了end--,小了begin++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> numsCopy(nums.begin(), nums.end());
sort(numsCopy.begin(), numsCopy.end()); // O(nlogn)
int i = 0;
int j = numsCopy.size()-1;
while (i < j)
{
int sum = numsCopy[i] + numsCopy[j];
if (sum < target)
i++;
else if (sum > target)
j--;
else
{
break;
}
}
return GetIndexOfAddends(nums, numsCopy[i], numsCopy[j]);
}
private:
vector<int> GetIndexOfAddends(const vector<int>& nums, int addend1, int addend2)
{
vector<int> result;
for (int i=0; i<nums.size(); i++)
{
if (nums[i] == addend1 || nums[i] == addend2)
{
result.push_back(i+1);
}
}
return result;
}
};
解决方案3:O(n)
用map存储,key为target与当前元素的差值,value为当前元素的位置
样例中map中会存储(7,1)(2,2)(-2,3)(-6,4)
如果当前元素有在map中,就找到了。
vector <int> twoSum(vector<int> &nums, int target)
{
vector<int> result(2);
map<int, size_t> resuMap;
for (int i = 0; i < nums.size(); ++i)
{
int substract = target - nums[i];
if (resuMap.count(nums[i]))
{
result[0] = resuMap[nums[i]];
result[1] = i + 1;
return result;
}
else
resuMap[substract] = i + 1;
}
}