Leetcode 1 Two Sum

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方法为的复杂度,利用HashMap可以实现的复杂度。

具体思路就是,遍历第一遍的时候建立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的时候就回头查有没有元素。

posted @ 2019-05-31 23:14  jenny1000000  阅读(124)  评论(0编辑  收藏  举报