이분탐색
, LIS
https://leetcode.com/problems/minimum-operations-to-make-a-subsequence/description/
class Solution {
public int minOperations(int[] target, int[] arr) {
// target 배열의 인덱스와 값을 바꾸어 저장 (key: target 값, value: 인덱스)
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < target.length; i++) {
map.put(target[i], i);
}
List<Integer> idxArr = new ArrayList<>();
for(int i = 0; i < arr.length; i++) {
if(!map.containsKey(arr[i])) {
continue;
}
idxArr.add(map.get(arr[i]));
}
int[] lis = new int[target.length];
int lisLength = 0;
if(!idxArr.isEmpty()) {
lis[0] = idxArr.get(0);
lisLength = 1;
for(int i=1; i<idxArr.size(); i++) {
// 마지막에 삽입
if(lis[lisLength - 1] < idxArr.get(i)) {
lis[lisLength++] = idxArr.get(i);
}
// 중간에 삽입
else {
int index = binarySearch(lis, lisLength, idxArr.get(i));
lis[index] = idxArr.get(i);
}
}
}
return target.length - lisLength;
}
public int binarySearch(int[] lis, int lisLength, int targetIdx) {
int left = 0;
int right = lisLength - 1;
while(left < right) {
int mid = left + (right - left) / 2;
if(lis[mid] >= targetIdx) {
right = mid;
} else {
left = mid + 1;
}
}
return right;
}
}
구현
// target 배열의 인덱스와 값을 바꾸어 저장 (key: target 값, value: 인덱스)
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < target.length; i++) {
map.put(target[i], i);
}
List<Integer> idxArr = new ArrayList<>();
for(int i = 0; i < arr.length; i++) {
if(!map.containsKey(arr[i])) {
continue;
}
idxArr.add(map.get(arr[i]));
}
if(!idxArr.isEmpty()) {
lis[0] = idxArr.get(0);
lisLength = 1;
for(int i=1; i<idxArr.size(); i++) {
// 마지막에 삽입
if(lis[lisLength - 1] < idxArr.get(i)) {
lis[lisLength++] = idxArr.get(i);
}
// 중간에 삽입
else {
int index = binarySearch(lis, lisLength, idxArr.get(i));
lis[index] = idxArr.get(i);
}
}
}
2시간