LeetCode:TwoSum解决方案

时间:2017-03-17 06:45:51

标签: c++

我正在尝试使用地图来为这个答案https://leetcode.com/problems/two-sum/#/description O(n)制作算法,但由于某些原因我得到了很多测试用例的不正确索引我是试图

据我所知,我正在为迭代器正确地进行检查,但这些对我来说是新的,我不完全确定我是否正在返回我想要的正确索引。

//My Code:



#include <iostream>
#include <cstdio>
#include <array>
#include <vector>
#include <map>

std::vector<int> twoSum(int nums[], int size, int target)
{
    std::vector<int> answer;
    std::map<int, int> myMap;
    std::map<int, int>::iterator it;
    std::cout << size << std::endl;
    for (int i = 0; i < size; i++)
    {
        myMap.insert(std::pair<int, int>(nums[i], i));
        int indexItOne = distance(myMap.begin(), myMap.find(nums[i]));
        int indexItTwo = distance(myMap.begin(), myMap.find(target-nums[i]));
        it = myMap.find(target - nums[i]);

        if (it != myMap.begin() || indexItOne != indexItTwo)
        {
            answer.push_back(i);
            answer.push_back(distance(myMap.begin(), myMap.find(target - nums[i])));
            return answer;
        }

    }//for

}//twoSum

1 个答案:

答案 0 :(得分:1)

你是正确的,因为地图应该是从numnum索引的映射,但不应该立即插入到地图中。这是由于问题的限制

  

你可能不会两次使用相同的元素。

因此,该算法会更像这样:

class Solution {
  public:
    vector<int> twoSum(vector<int>& nums, int target) {
      // Create a mapping from num -> index of num
      unordered_map<int, int> m;

      for(int i = 0; i < nums.size(); i++) {
        // Check if we have seen our buddy
        int buddy = target - nums[i];
        auto buddyIt = m.find(buddy);

        if(buddyIt != m.end()) {
          // Buddy found, return answer
          return vector<int>{ buddyIt->second, i };
        }

        // Buddy not found, insert current num into buddy map
        m[nums[i]] = i;
      }
    }
};