본문 바로가기
알고리즘/LeetCode

128: Longest Consecutive Sequence

by cjw.git 2021. 8. 5.

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


1. 문제

  • Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence.
    You must write an algorithm that runs in O(n) time.

 


2. 문제의 조건

  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

 


더보기

3. 문제 접근

  • 아이디어

    저는 처음에 O(N)이란 시간제한을 보고 Counter Sort의 아이디어를 떠올려 list로 해결하려 했습니다.
    min값을 찾고 -가 되는 값을 각 배열에 더해줄 생각을 하였습니다. (-3, 4, -1, 3)이 나올 경우 arr[-3]은 존재하지 않으므로 arr[-3]을 arr[0]으로 보정시켜주기 위해 arr[-3 + min(arr)]로 할생각.
    하지만 입력값을 보니 10^9 .. Counter Sort방식을 사용하기엔 너무 많은 메모리와 리스트를 생성하는 것 자체만으로도 굉장히 많은 시간이 소요된다는걸 깨닫고 고민한 끝에 알고리즘 강의 때 배운 Find-union(Dispoint Set) 방식과 DFS를 생각하였고 DFS로 해결하고자 하였습니다.
    주어진 배열의 최소값을 찾고 해당 최소값부터 +1 씩 한 값을 찾아가며 탐색하는 것입니다.[-3, -2, -1, 3,  5, 7]이 될 경우 최소값은 -3이고 -3 + 1인 -2를 탐색하고 +1 인 -1을 탐색하고 +1 인 0을 찾는데 만약 없으면 이 길이는 3을 반환합니다. 이 때, 3, 5, 7에 대한 탐색이 수행되지 않았으므로 남은 배열중 최소를 찾고 처음과 같이 탐색을 진행합니다.

 


4. 풀이 방법

  • 인접리스트로 (key, value) 값, 방문상태 로 기억합니다.
  • 최소값을 찾고 그 최소값을 기준으로 DFS를 수행합니다  ---- 1
    만약 방문하려는 시점이 존재하지 않거나 이미 방문해 있으면 지금까지 방문한 길이를 return합니다.
    아니라면
    지금 방문한 곳을 True로 만들어주고 start + 1을 탐색합니다. (length도 1 증가해야함)
  • 아직 방문되지 않은곳을 파악 후 list로 만들어주고 모든 지점을 방문할 때 까지 무한반복합니다. (memory[data] 가 모두 True이면 전부다 방문한 상태임.)
  • 1부터 반복합니다.

 


5. 소스코드

 


 

cjw.git@gmail.com

'알고리즘 > LeetCode' 카테고리의 다른 글

287: Find the Duplicate Number  (0) 2021.08.05
46: PERMUTATIONS  (0) 2021.08.05

댓글