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