[JS] Longest Increasing Subsequence
🔒 문제 (LeetCode 300)
Given an integer array nums, return the length of the longest strictly increasing subsequence.
A subsequence is a sequence that can be derived from an array by deleting some or no elements without changing the order of the remaining elements. For example, [3,6,2,7] is a subsequence of the array [0,3,1,6,2,2,7].
Constraints:
- 1 <= nums.length <= 2500
- -104 <= nums[i] <= 104
Follow up: Can you come up with an algorithm that runs in O(n log(n)) time complexity?
🌊 입출력
Example 1:
Input: nums = [10,9,2,5,3,7,101,18]
Output: 4
Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4.
Example 2:
Input: nums = [0,1,0,3,2,3]
Output: 4
Example 3:
Input: nums = [7,7,7,7,7,7,7]
Output: 1
🔑 해결
🌌 알고리즘 - 이분탐색
minTails[i] = i+1개의 수로 만든 increasing subsequence 중 가장 작은 tail의 배열
minTails는 항상 오름차순 정렬되어 있으므로 이분탐색으로 업데이트 가능하다. minTails를 업데이트 하며 가장 긴 subsequence의 길이 len을 구한다.
nums의 요소를 n이라고 할 때, minTails 배열을 구하기 위해서
1) n이 모든 minTails보다 크다면 추가하고 len을 1 증가
2) minTails[i-1] < n <= minTails[i] 일 경우 minTails[i] 업데이트
/**
* @param {number[]} nums
* @return {number}
*/
var lengthOfLIS = function(nums) {
let minTails = new Array(nums.length)
let len = 0
for(const n of nums) {
let [l, r] = [0, len]
while(l < r) {
let mid = l + r >>> 1
if(minTails[mid] < n) l = mid + 1
else r = mid
}
minTails[l] = n
if(l === len) len++
}
return len
};
'코딩테스트 (JS) > 이분탐색' 카테고리의 다른 글
[JS] Find Peak Element (0) | 2022.08.05 |
---|---|
[JS] Find Minimum in Rotated Sorted Array (0) | 2022.08.05 |
[JS] Search a 2D Matrix (0) | 2022.08.04 |
[JS] Search in Rotated Sorted Array (0) | 2022.08.04 |
[JS] Find First and Last Position of Element in Sorted Array (0) | 2022.08.04 |