그동안 기초반에서 배운 것
heap, merge sort, doublely linked list
시간복잡도가 낮다.
가장 작은게 root
시간복잡도가 낮다
가장 큰게 root
k(=3)번째로 큰 수 찾기 -> min heap 사용
힙 사이즈 : k + 1
[28, 3, 2, 1, 2, 4, 54, 3, 5, 4, 528, 384, 92739, 8273, ...]
O(nlog2k) -> O(nlogk)
heapify -> O(logk)
heapify 가 up, down 두번이므로 O(logk + logk) = O(log2k)
O(k+1)
function buildMinHeap(arr, k) {
if (!arr.length) return -1;
const minHeap = new MinHeap(k + 1, arr.length);
// build a minheap (초기 힙)
for (let i = 0; i < k + 1; i++) {
minHeap.insert(arr[i]);
}
// 힙 업데이트
for (let i = k + 1; i < arr.length; i++) {
minHeap.removeMin(); // swap first and last => heapfy down
minHeap.insert(arr[i]); // put the current element in the last queue => heapify
}
return minHeap.removeMin();
}
다음에 배울 것
string manipulation
- sliding window
- two pointers
- rolling hash
- string matching
추후
-> trie, binary search, greedy, back tracking, recursion, memonization, monotonic queue