LIS - Binary search를 이용한 O(NlogN) 풀이
2021. 7. 10. 15:53
항상 DP를 이용한 O(N^2) 풀이만 쓰다가, Binary search를 활용한 O(NlogN)을 공부했다.
생각보다 너무 쉬웠다.
https://www.youtube.com/watch?v=TocJOW6vx_I&t=208s
기본 아이디어는 배열에 LIS를 만들어가는데에서 시작한다.
주어지는 수 배열인 nums에서 숫자 n을 하나씩 따와서, LIS에 넣을 때 어디에 들어갈 지 체크한다.
만약 맨 끝에 들어갈 수 있다면 그대로 넣어서 LIS가 1 더 증가하는 것이고,
만약 맨 끝에 들어가지 못한다면, 이진 탐색으로 n <= elem 인 elem을 찾은 뒤 n으로 바꿔 끼워넣는다.
(왜? elem은 n보다 크기 때문에, 더 작은 n으로 바꿔 끼워 넣어도 LIS가 유지되고,
추후 더 긴 LIS를 찾는데 도움되기 때문에 무조건 이득이다.)
아래 블로그도 비슷한 논리로 설명함.
https://jason9319.tistory.com/113
Py
from bisect import bisect_left
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
LIS = []
for n in nums:
idx = bisect_left(LIS, n)
if idx == len(LIS):
LIS.append(n)
else:
LIS[idx] = n
print(LIS)
return len(LIS)
C++
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> LIS;
for (int n : nums){
auto it = lower_bound(LIS.begin(), LIS.end(), n);
if(it == LIS.end())
LIS.push_back(n);
else
LIS[it-LIS.begin()] = n;
}
return LIS.size();
}
};
시각화 잘 해놓은 블로그
'<PS> > [특수 알고리즘]' 카테고리의 다른 글
Tortoise and hare 활용 (0) | 2022.02.07 |
---|---|
LCS(최장 공통 부분 수열) 알고리즘 (0) | 2021.07.27 |
Prüfer sequence - Labeled Tree 인코딩/디코딩 (0) | 2021.06.26 |
Monotone Queue Technique (Sliding window, DP 최적화) (0) | 2021.06.10 |
Traveling Salesman Problem 외판원 문제 (NP-Hard) (0) | 2021.06.07 |