我正在尝试使用地图来为这个答案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
答案 0 :(得分:1)
你是正确的,因为地图应该是从num
到num
索引的映射,但不应该立即插入到地图中。这是由于问题的限制
你可能不会两次使用相同的元素。
因此,该算法会更像这样:
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;
}
}
};