LeetCode #1

Two Sum

1개의 풀이 · C++

문제 원문 보기 ↗

SOLUTION INFO

C++ · main.cpp

main.cpp
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int N = (int)nums.size();
        vector<int> idx(N); iota(idx.begin(), idx.end(), 0);
        sort(idx.begin(), idx.end(), [&](int u, int v) -> bool {
            return nums[u] < nums[v];
        });
        vector<int> answer;
        for(int i = 0; i < N; ++i) {
            int x = target - nums[idx[i]];
            int l = 0, r = N - 1;
            while(l <= r) {
                int mid = (l + r) / 2;
                if(nums[idx[mid]] < x) l = mid + 1;
                else r = mid - 1;
            }
            if(l < N && idx[l] == idx[i]) ++l;
            if(l < N && nums[idx[l]] == x) {
                answer.push_back(idx[l]);
                answer.push_back(idx[i]);
                break;
            }
        }
        return answer;
    }
};

SOLUTION DESCRIPTION

풀이 설명

원래 인덱스 배열을 값의 오름차순으로 정렬한 뒤, 각 원소마다 합이 target이 되기 위해 필요한 값을 이분 탐색한다. 찾은 위치가 현재 원소와 같으면 다음 위치를 확인해 같은 원소를 두 번 사용하는 경우를 피한다. 정렬에 O(N log N), 각 원소의 이분 탐색에 O(N log N)이 들고 인덱스 배열에 O(N)의 추가 공간을 사용한다.