File tree 3 files changed +85
-0
lines changed
lowest-common-ancestor-of-a-binary-search-tree
non-overlapping-intervals
3 files changed +85
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * @description
3
+ * 최대한 많은 양의 돈이라는 문구에서 dynamic programming을 연상
4
+ * 연속된 집은 털 수 없다라는 문구에서 점화식을 도출 할 수 있었음
5
+ *
6
+ * n = length of nums
7
+ * time complexity: O(n)
8
+ * space complexity: O(n)
9
+ */
10
+ var rob = function ( nums ) {
11
+ if ( nums . length === 1 ) return nums [ 0 ] ;
12
+
13
+ const dp = Array ( nums . length ) . fill ( 0 ) ;
14
+
15
+ dp [ 0 ] = nums [ 0 ] ;
16
+ dp [ 1 ] = Math . max ( nums [ 1 ] , dp [ 0 ] ) ;
17
+
18
+ for ( let i = 2 ; i < nums . length ; i ++ )
19
+ dp [ i ] = Math . max ( dp [ i - 2 ] + nums [ i ] , dp [ i - 1 ] ) ;
20
+
21
+ return dp [ nums . length - 1 ] ;
22
+ } ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @description
3
+ * bfs, dfs와 같은 순회 방법과 treeNode 구조에 child가 아닌 parent라는 속성을 부여해 부모찾기를 아이디어로 접근
4
+ * 하지만 모든 노드를 순회해야하고 p와 q가 속한지점과 둘이 포함하는 관계인지를 중점으로 문제에 접근함
5
+ * 그 결과 postOrder를 생각하게 되어 문제 풀이
6
+ *
7
+ * n = length of total treeNode
8
+ * time complexity: O(n)
9
+ * space complexity: O(n)
10
+ */
11
+ var lowestCommonAncestor = function ( root , p , q ) {
12
+ let answer = null ;
13
+
14
+ const postOrder = ( tree ) => {
15
+ if ( tree === null ) return [ false , false ] ;
16
+
17
+ const [ hasLeftP , hasLeftQ ] = postOrder ( tree . left ) ;
18
+ const [ hasRightP , hasRightQ ] = postOrder ( tree . right ) ;
19
+
20
+ const hasP = hasLeftP || hasRightP || tree . val === p . val ;
21
+ const hasQ = hasLeftQ || hasRightQ || tree . val === q . val ;
22
+
23
+ if ( hasP && hasQ && answer === null ) answer = tree ;
24
+
25
+ return [ hasP , hasQ ] ;
26
+ } ;
27
+
28
+ postOrder ( root ) ;
29
+
30
+ return answer ;
31
+ } ;
Original file line number Diff line number Diff line change
1
+ /**
2
+ * @description
3
+ * overlapping이 안되기위한 기준이 필요함을 느낌
4
+ * 처음에는 시작점, 끝점을 기준으로 정렬했지만 16번 테스트에서 실패
5
+ * 정렬기준이 끝점, 시작점 순으로 정렬해야한다고 깨닫게 됨
6
+ *
7
+ * n = length of intervals
8
+ * time complexity: O(n log n)
9
+ * space complexity: O(n)
10
+ */
11
+ var eraseOverlapIntervals = function ( intervals ) {
12
+ intervals . sort ( ( a , b ) => {
13
+ if ( a [ 1 ] !== b [ 1 ] ) return a [ 1 ] - b [ 1 ] ;
14
+ if ( a [ 0 ] !== b [ 0 ] ) return b [ 0 ] - a [ 0 ] ;
15
+ return 0 ;
16
+ } ) ;
17
+
18
+ let answer = 0 ;
19
+ const current = intervals [ 0 ] ;
20
+
21
+ for ( let i = 1 ; i < intervals . length ; i ++ ) {
22
+ const [ start , end ] = intervals [ i ] ;
23
+
24
+ if ( current [ 1 ] > start ) answer ++ ;
25
+ else {
26
+ current [ 0 ] = start ;
27
+ current [ 1 ] = end ;
28
+ }
29
+ }
30
+
31
+ return answer ;
32
+ } ;
You can’t perform that action at this time.
0 commit comments