Question : Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
C code
int* twoSum(int* nums, int numsSize, int target)
{
int *index = (int*)malloc(2*sizeof(int));
int i,j;
for(i=0; i<numsSize-1; i++)
for(j=i+1; j<numsSize; j++)
{
if(nums[i] + nums[j] == target)
{
*index = i;
*(index+1) = j;
}
}
return index;
}
出现的报错:最开始是用int index[2]建立数组的,没有通过编译。
C++ code
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> index;
int i,j;
for(i=0; i<nums.size()-1; i++)
for(j=1; j<nums.size(); j++)
{
if(nums[i] + nums[j] == target)
{
index.push_back(i);
index.push_back(j);
}
}
return index;
}
};
改进的算法
以上的brute force方法为 O ( n 2 ) O(n^2) O(n2)的复杂度,利用HashMap可以实现 O ( n ) O(n) O(n)的复杂度。
具体思路就是,遍历第一遍的时候建立HashMap,第二遍的时候,遍历到的每一个数用target作差,然后看看HashMap里面有没有对应的元素。
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int, int> m;
vector<int> result;
// one pass: build Hashmap
for(int i=0; i<nums.size(); i++)
m[nums[i]] = i;
//second pass: check
for(int i=0; i<nums.size(); i++)
{
int r = target - nums[i];
if( m.count(r) && m[r]!=i )
{
result.push_back(i);
result.push_back(m[r]);
break;
}
}
return result;
}
然后还有一个one pass的改进算法,思路就是在构造HashMap的时候就回头查有没有元素。