Longest Increasing Subsequence
LeetCode 300. Longest Increasing Subsequence
원문
Given an integer array nums
, return the length of the longest strictly increasing subsequence.
풀이
리스트 result
를 생성한다.
리스트의 첫 원소는 nums[0]
이다.
nums
의 두 번째 원소부터 마지막 원소까지 순회한다.
result
의 마지막 원소보다nums[i]
가 더 크면result
에nums[i]
를 추가한다.result
의 마지막 원소보다nums[i]
가 크지 않다면 이분 탐색으로nums[i]
가result
에 들어갈 자리를 찾아 원소의 값을 바꿔준다.
순회가 끝나면 result
의 길이를 반환한다.
코드
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
result = list()
result.append(nums[0])
for i in range(1, len(nums)):
if result[-1] < nums[i]:
result.append(nums[i])
else:
lo, hi = 0, len(result) - 1
while lo < hi:
mid = (lo + hi) // 2
if result[mid] < nums[i]:
lo = mid + 1
else:
hi = mid
result[lo] = nums[i]
return len(result)
Java
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
class Solution {
public int lengthOfLIS(int[] nums) {
List<Integer> result = new ArrayList<>();
for (int num: nums) {
if (result.isEmpty()) {
result.add(num);
continue;
}
if (num > result.get(result.size() - 1)) {
result.add(num);
continue;
}
int lo = 0;
int hi = result.size() - 1;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (result.get(mid) < num) {
lo = mid + 1;
} else {
hi = mid;
}
}
result.set(lo, num);
}
return result.size();
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.