File tree Expand file tree Collapse file tree 5 files changed +211
-0
lines changed
find-median-from-data-stream
kth-smallest-element-in-a-bst
lowest-common-ancestor-of-a-binary-search-tree Expand file tree Collapse file tree 5 files changed +211
-0
lines changed Original file line number Diff line number Diff line change 1+ import java .util .PriorityQueue ;
2+
3+ class MedianFinder {
4+
5+ // 작은 수 범위 저장하는 힙
6+ private PriorityQueue <Integer > smallHeap ;
7+
8+ // 큰 수 범위 저장하는 힙
9+ private PriorityQueue <Integer > largeHeap ;
10+
11+ public MedianFinder () {
12+ smallHeap = new PriorityQueue <>((a , b ) -> b - a );
13+ largeHeap = new PriorityQueue <> ((a , b ) -> a - b );
14+ }
15+
16+ public void addNum (int num ) {
17+ // 작은 수 범위에 삽입
18+ smallHeap .offer (num );
19+ // 작은 수 범위에서 최댓값을 뽑아 큰 수 범위로 이동
20+ largeHeap .offer (smallHeap .poll ());
21+
22+ // 만약 작은 수 범위의 개수가 큰 수 범위보다 작다면
23+ if (smallHeap .size () < largeHeap .size ()) {
24+ // 큰 수 범위에서 최솟값을 뽑아 작은 수 범위로 이동
25+ smallHeap .offer (largeHeap .poll ());
26+ }
27+ }
28+
29+ public double findMedian () {
30+ // 짝수 개일 경우
31+ if (smallHeap .size () == largeHeap .size ()) {
32+ // 작은 수 범위 힙의 최댓값 + 큰 수 범위 힙의 최솟값의 평균
33+ return (smallHeap .peek () + largeHeap .peek ()) / 2.0 ;
34+ }
35+ // 작은 수 범위 힙의 최댓값
36+ return smallHeap .peek ();
37+ }
38+ }
39+
40+ /**
41+ * Your MedianFinder object will be instantiated and called as such:
42+ * MedianFinder obj = new MedianFinder();
43+ * obj.addNum(num);
44+ * double param_2 = obj.findMedian();
45+ */
46+
Original file line number Diff line number Diff line change 1+ import java .util .ArrayList ;
2+ import java .util .List ;
3+
4+ class Solution {
5+
6+ // 시간, 공간복잡도: O(n)
7+ public int [][] insert (int [][] intervals , int [] newInterval ) {
8+
9+ // 병합된 interval 담는 list
10+ List <int []> modifyIntervals = new ArrayList <>();
11+
12+ int idx = 0 ;
13+
14+ // 병합 이전 구간
15+ while (idx < intervals .length && intervals [idx ][1 ] < newInterval [0 ]) {
16+ modifyIntervals .add (intervals [idx ]);
17+ idx ++;
18+ }
19+
20+ // 병합이 필요한 구간 (newInterval과 겹치는 구간)
21+ while (idx < intervals .length && intervals [idx ][0 ] <= newInterval [1 ]) {
22+ newInterval [0 ] = Math .min (intervals [idx ][0 ], newInterval [0 ]);
23+ newInterval [1 ] = Math .max (intervals [idx ][1 ], newInterval [1 ]);
24+ idx ++;
25+ }
26+
27+ // 최종 병합된 새로운 interval add
28+ modifyIntervals .add (newInterval );
29+
30+ // 병합 이후 구간
31+ while (idx < intervals .length ) {
32+ modifyIntervals .add (intervals [idx ]);
33+ idx ++;
34+ }
35+
36+ return modifyIntervals .toArray (new int [modifyIntervals .size ()][2 ]);
37+ }
38+ }
39+
Original file line number Diff line number Diff line change 1+ /**
2+ * Definition for a binary tree node.
3+ * public class TreeNode {
4+ * int val;
5+ * TreeNode left;
6+ * TreeNode right;
7+ * TreeNode() {}
8+ * TreeNode(int val) { this.val = val; }
9+ * TreeNode(int val, TreeNode left, TreeNode right) {
10+ * this.val = val;
11+ * this.left = left;
12+ * this.right = right;
13+ * }
14+ * }
15+ */
16+ class Solution {
17+
18+ private int count = 0 ;
19+
20+ private int kthSmallValue = 0 ;
21+
22+ // 시간복잡도: O(k) (불균형 상태의 이진 트리일 경우 O(n))
23+ public int kthSmallest (TreeNode root , int k ) {
24+ orderSearch (root , k );
25+ return kthSmallValue ;
26+ }
27+
28+ // In Order Search
29+ private void orderSearch (TreeNode node , int k ) {
30+
31+ if (node == null ) {
32+ return ;
33+ }
34+
35+ // HINT => utilize the property of a BST => 좌측 리프 노드부터 탐색
36+ orderSearch (node .left , k );
37+
38+ count ++;
39+
40+ if (count == k ) {
41+ kthSmallValue = node .val ;
42+ return ;
43+ }
44+
45+ // search right side
46+ orderSearch (node .right , k );
47+
48+ }
49+
50+ }
51+
Original file line number Diff line number Diff line change 1+ /**
2+ * Definition for a binary tree node.
3+ * public class TreeNode {
4+ * int val;
5+ * TreeNode left;
6+ * TreeNode right;
7+ * TreeNode(int x) { val = x; }
8+ * }
9+ */
10+ class Solution {
11+ public TreeNode lowestCommonAncestor (TreeNode root , TreeNode p , TreeNode q ) {
12+
13+ if (root == null || root == p || root == q ) {
14+ return root ;
15+ }
16+
17+ // 재귀로 좌측과 우측 탐색
18+ TreeNode left = lowestCommonAncestor (root .left , p , q );
19+
20+ TreeNode right = lowestCommonAncestor (root .right , p , q );
21+
22+ // 좌우 둘 다 null이 아니라면: 현재 root를 조상으로 하는 서브 트리에서 p와 q를 발견했음을 의미하므로 root가 공통 조상
23+ if (left != null && right != null ) {
24+ return root ;
25+ } else if (left != null ) {
26+ return left ;
27+ } else {
28+ return right ;
29+ }
30+
31+ }
32+ }
33+
Original file line number Diff line number Diff line change 1+ import java .util .Collections ;
2+ import java .util .List ;
3+
4+ /**
5+ * Definition of Interval:
6+ * public class Interval {
7+ * int start, end;
8+ * Interval(int start, int end) {
9+ * this.start = start;
10+ * this.end = end;
11+ * }
12+ * }
13+ */
14+
15+ public class Solution {
16+ /**
17+ * @param intervals: an array of meeting time intervals
18+ * @return: if a person could attend all meetings
19+ */
20+
21+ // 시간복잡도: O(n log n) - 정렬, 공간복잡도: O(1)
22+ public boolean canAttendMeetings (List <Interval > intervals ) {
23+ // Write your code here
24+
25+ if (intervals == null || intervals .isEmpty ()) return true ;
26+
27+ Collections .sort (intervals , (i1 , i2 ) -> i1 .start - i2 .start );
28+
29+ Interval previous = intervals .get (0 );
30+
31+ for (int i = 1 ; i < intervals .size (); i ++) {
32+ Interval current = intervals .get (i );
33+ if (previous .end > current .start ) {
34+ return false ;
35+ }
36+ previous = current ;
37+ }
38+
39+ return true ;
40+ }
41+ }
42+
You can’t perform that action at this time.
0 commit comments