반응형

https://leetcode.com/problems/longest-consecutive-sequence/

 

Longest Consecutive Sequence - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

모든 숫자들을 unordered_set에 담아줍니다.

unordered_set을 순회하면서, 각 숫자마다 좌우를 검사하며 길이를 구해줍니다.

아직 검사하지 않은 숫자에 대해 위 과정을 반복하며 최대 길이를 구해줍니다.

 

class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> st(nums.begin(), nums.end());
        int mx = 0;
        for(int num : st) {
            int prv = num - 1;
            int nxt = num + 1;
            while(st.find(prv) != st.end()) st.erase(prv--);
            while(st.find(nxt) != st.end()) st.erase(nxt++);
            mx = max(mx, nxt - prv - 1);
        }
        return mx;
    }
};

 

다음과 같은 방법으로도 풀이할 수 있었습니다.

이미 검사된 범위는 넘어가도록 하고, 기존의 unordered_set은 건드리지 않는 것입니다.

class Solution {
private:
    vector<pair<int, int>> checkedRange;
public:
    bool isChecked(int val) {
        for(pair<int, int> &p : checkedRange)
            if(p.first < val && val < p.second) return true;
        return false;
    }

    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> st(nums.begin(), nums.end());
        int mx = 0;
        for(int num : st) {
            if(isChecked(num)) continue;
            int prv = num - 1;
            int nxt = num + 1;
            while(st.find(prv--) != st.end());
            while(st.find(nxt++) != st.end());
            checkedRange.push_back({prv, nxt});
            mx = max(mx, nxt - prv - 3);
        }
        return mx;
    }
};

검사한 모든 요소들을 제거하는 작업이 사라져서 더 빨라지지 않을까 싶었습니다.

검사된 범위에 속하는지 확인하는 작업이 필요해서 데이터에 따른 차이가 있을 듯 합니다.

반응형

'Algorithm' 카테고리의 다른 글

LeetCode 6 : Zigzag Conversion  (0) 2022.03.06
백준 15942 : Thinking Heap  (0) 2022.02.12
백준 16987 : 계란으로 계란치기  (0) 2022.02.05
백준 1722 : 순열의 순서  (0) 2022.02.02
백준 2166 : 다각형의 면적  (0) 2022.01.31

+ Recent posts