(Leetcode) [Array]: Two sum

Topic: Array
Difficulty: Easy


이 문제를 풀기 전에 학교에서 C++을 배울땐 벡터를 배우지 않았기 때문에 geeksforgeeks에서 벡터에 대해서 공부를 조금 했다.

문제의 내용은 합이 target이 되는 두 개의 element의 index들을 찾는 것이다. 중첩된 두 개의 for loop (Brute Force method)를 쓰지 않고 할 수 있는 방법을 쉽게 생각해내지 못 했다. 참고로 Brute Force의 time complexity는 O(n^2).

결국 구글에 algorithm for two sum을 검색해서 time complexity가 O(n)인, 하나의 for loop을 써서 풀 수 있는 알고리즘을 찾아 보았다.

Solution

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> result;
        unordered_map<int, int> hash;
        
        for (int i=0; i<nums.size(); i++) {
            int temp = target - nums[i];
            
            if (hash.find(temp) != hash.end()) {
                result.push_back(i);
                result.push_back(hash[temp]);
                return result;
            }
            hash[nums[i]] = i;
        }
        return {};
    }
};

일반 벡터가 아닌 unordered_map이라는 컨테이너를 사용했다. unordered_map은 key와 value로 이루어진 hash map이다. 위에 문제풀이와 같이 key와 value를 지정할 수 있다. unordered_map을 사용하려면 헤더에 <unordered_map>을 명시해줘야 한다.

find(value) for vector / find(key) for unordered_map: returns an iterator to the first element in the range [first, last) that compares equal to value . If no such element is found, it returns last element.

Categories:

Updated:

Leave a comment