Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- leetcode
- 문자열
- recursive
- list
- sorting
- DP
- linked list
- Depth-first Search
- 재귀
- Array
- dfs
- two pointers
- 중간
- hash table
- tree
- 미디움
- math
- matrix
- HashTable
- 리트코드
- backtracking
- string
- binary search
- Binary
- easy
- 이진트리
- binary tree
- Python
- 쉬움
- Medium
Archives
- Today
- Total
부부의 코딩 성장 일기
LeetCode 128(Longest Consecutive Sequence, Python) 본문
1. 문제 링크
LeetCode - The World's Leading Online Programming Learning Platform
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
2. 문제 설명
- unsorted 된 정수로 구성된 nums가 주어졌을 때, 가장 긴 연속된 elements 순서의 길이를 반환
- 시간복잡도는 O(n)으로 작성할 것
- 예시1)
- nums = [100,4,200,1,3,2]일 때,
- 여기서 가장 긴 연속된 시퀀스는 [1,2,3,4]이기 때문에, 해당하는 길이인 4를 반환
- nums = [100,4,200,1,3,2]일 때,
- 예시2)
- nums = [0,3,7,2,5,8,4,6,0,1]일 때,
- 가장 연속된 시퀀스는 [0,1,2,3,4,5,6,7,8]로 9를 반환
- 해당 예시에서 같은 정수가 반복해서 등장할 수 있음을 알 수 있음
- nums = [0,3,7,2,5,8,4,6,0,1]일 때,
3. 처음 풀이
- element에 같은 정수가 반복될 수 있으므로, 집합 변환 후 다시 array화 하여 중복을 없앤 뒤,
- nums를 sort를 시켰다.
- 만약 i번째 element의 값과 i+1번째 element의 값이 1 차이가 난다면, 연속된 sequence이므로, output에 1을 더하였고,
- 만약 i가 nums array의 끝에 도달했거나, 혹은 i+1과의 차이가 1이 아니라면,
- 지금까지의 output과, 이전의 max length를 비교하여, output이 max_length보다 크면, 해당값으로 max_length를 업데이트하고,
- output을 1로 리셋하였다.
- 최종적으로 max_length를 반환하였다.
- 그런데.. sort의 경우 시간복잡도가 O(NlogN)이다. 그래서 문제의 조건에 부합하지 않았다.
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
nums = list(set(nums))
nums.sort()
output = 1
max_length = 0
for i in range(len(nums)):
if (i == len(nums)-1) or (nums[i+1]-nums[i] != 1):
if output > max_length:
max_length = output
output = 1
else:
output +=1
return max_length
4. 다른 풀이
- sort를 사용하지 않고 푼 풀이
- nums를 set으로 변환하여 중복을 없애둔 다음에
- nums 안에 있는 element를 for문을 돌리면서,
- 만약 element n에 대하여 n-1이 집합에 없다면, n이 연속된 sequence의 시작점이므로
- length를 1로 초기화하고,
- n+length가 num에 존재할 때까지 while문을 돌린 후,
- 이전에 저장되있던 longest 변수와 비교하여 max값으로 업데이트한다.
- 예를 들어, 예시의 [100,4,200,1,3,2]의 경우,
- n=100일 때, 100-1인 99는 해당 리스트에 존재하지 않기 때문에, length =1이 되고, 100+1은 존재하지 않기 때문에, longest가 1로 저장이 된다.
- n=4일 때는, 4-1인 3이 list에 존재하므로 pass하고,
- n=200일 때는, 100과 동일하게 length=1이 되어, longest는 max(1,1)로 그대로 1이 된다.
- n=1일 때는, 1-1인 0이 리스트에 존재하지 않아서, length =1로 초기화되고, 2,3,4가 차례로 nums에 존재하기 때문에, length는 4가 되고, longest도 4로 바뀌어 저장이 된다.
- 마찬가지로, n=3,n=2일 때는 각각 n=2,n=1이 nums에 존재하므로 pass되어,
- 최종 길이 4가 반환된다.
- 만약 element n에 대하여 n-1이 집합에 없다면, n이 연속된 sequence의 시작점이므로
- nums 안에 있는 element를 for문을 돌리면서,
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
longest = 0
num_set = set(nums)
for n in num_set:
if (n-1) not in num_set:
length = 1
while (n+length) in num_set:
length += 1
longest = max(longest, length)
return longest
5. 배운 점
- sort는 시간복잡도가 O(nlogn)이다.
- sort를 사용하지 않고 푸는 풀이
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 292(Nim Game, Python) (0) | 2024.03.11 |
---|---|
LeetCode 290(Word Pattern, Python) (0) | 2024.03.09 |
LeetCode 283(Move Zeroes, Python) (0) | 2024.03.05 |
LeetCode 117(Populating Next Right Pointers in Each Node II ) (0) | 2024.03.03 |
LeetCode 268(Missing Number, Python) (1) | 2024.03.01 |