Search

Longest Harmonious Subsequence

문제 설명 : 문제에서 제공하는 Harmonious Subsequence 조건에 맞는 하위 배열 중 가장 긴 길이를 반환하는 것이다.
풀이 방법
Sorting 문제이기 했지만, Sorting은 최소 O(NlogN) 이기 때문에 solved도 해시 테이블을 사용한 방식으로 진행했다.
시간복잡도 : O(N)O(N)
성공 코드(해시 테이블 사용 방식)
from collections import Counter class Solution: def findLHS(self, nums: List[int]) -> int: nums_count_info = Counter(nums) result = 0 for k in nums_count_info.keys(): if nums_count_info[k-1]: result = max(result, nums_count_info[k] + nums_count_info[k-1]) if nums_count_info[k+1]: result = max(result, nums_count_info[k] + nums_count_info[k+1]) return result
Python
복사
성공 코드(sorting 사용 방식)
아래 방식은 sort 사용으로 인해 시간 복잡도가 NlogN 이지만, 공간 복잡도는 해시 테이블 방식에 비해 더 좋은 결과를 보여줄 것이다.
from typing import List class Solution: def findLHS(self, nums: List[int]) -> int: nums.sort() result = 0 # Harmonious Subsequence 요소 중 작은 숫자에 대한 정보를 저장 prev_count = 0 prev_num = None current_count = 1 for i in range(1, len(nums)): # 동일 숫자라면, 현 숫자에 대한 카운팅 증가 if nums[i] == nums[i-1]: current_count += 1 else: # 첫 숫자거나, Harmonious Subsequence 중 큰 값이 작은 숫자보다 1이 커서 조건에 맞을 때 # EX) [..., 2, 2, 2, 3, 3, 4 ...] 일 경우 # prev_num은 2, nums[i-1]은 3, nums[i]는 4 if prev_num is not None and nums[i-1] == prev_num + 1: result = max(result, prev_count + current_count) # prev -> prev + 1 숫자로 설정 # EX) [..., 2, 2, 2, 3, 3, 4 ...] 일 경우 # 기존 prev_num은 2였지만, 이제 3으로 변경한다. prev_num = nums[i-1] prev_count = current_count # 현 숫자(4)는 다시 1부터 시작한다. current_count = 1 # 마지막 원소까지 검사한 후에도 prev_num과 nums[-1]을 비교하여 결과를 갱신 if prev_num is not None and nums[-1] == prev_num + 1: result = max(result, prev_count + current_count) return result
Python
복사