File tree Expand file tree Collapse file tree 4 files changed +135
-0
lines changed
construct-binary-tree-from-preorder-and-inorder-traversal Expand file tree Collapse file tree 4 files changed +135
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * 시간 복잡도:
3+ * nums의 길이만큼 for문을 순회하고, 내부에서 투 포인터로 또 한 번 순회하므로, O(n²)
4+ * 공간 복잡도:
5+ * 정렬은 추가 공간 사용이 없음.
6+ * res 배열의 크기는 고유한 세 숫자 조합의 갯수.
7+ * 이를 k라고 하면, 공간 복잡도는 O(k)
8+ */
9+ /**
10+ * @param {number[] } nums
11+ * @return {number[][] }
12+ */
13+ var threeSum = function ( nums ) {
14+ nums . sort ( ( a , b ) => a - b ) ;
15+
16+ const res = [ ] ;
17+ for ( let i = 0 ; i < nums . length ; i ++ ) {
18+ if ( i > 0 && nums [ i ] === nums [ i - 1 ] ) {
19+ continue ;
20+ }
21+
22+ let l = i + 1 ;
23+ let r = nums . length - 1 ;
24+ while ( l < r ) {
25+ const sum = nums [ i ] + nums [ l ] + nums [ r ] ;
26+ if ( sum > 0 ) {
27+ r -- ;
28+ } else if ( sum < 0 ) {
29+ l ++ ;
30+ } else if ( sum === 0 ) {
31+ res . push ( [ nums [ i ] , nums [ l ] , nums [ r ] ] ) ;
32+ l ++ ;
33+ r -- ;
34+ while ( l < r && nums [ l ] === nums [ l - 1 ] ) {
35+ l ++ ;
36+ }
37+ }
38+ }
39+ }
40+ return res ;
41+ } ;
Original file line number Diff line number Diff line change 1+ /**
2+ * 시간 복잡도:
3+ * 메모이제이션을 사용하여 n까지 가기 위한 방법의 수를 저장.
4+ * 재귀 함수는 최대 n만큼 호출됨.
5+ * 따라서, 시간 복잡도는 O(n)
6+ * 공간 복잡도:
7+ * 메모 객체의 크기는 n의 크기와 같음.
8+ * 재귀 함수는 최대 n만큼 호출됨.
9+ * 따라서, 공간 복잡도는 O(n)
10+ */
11+ /**
12+ * @param {number } n
13+ * @return {number }
14+ */
15+ var climbStairs = function ( n ) {
16+ const memo = [ 0 , 1 , 2 ] ;
17+ const recurse = ( n ) => {
18+ if ( memo [ n ] ) {
19+ return memo [ n ] ;
20+ }
21+ memo [ n ] = recurse ( n - 1 ) + recurse ( n - 2 ) ;
22+ return memo [ n ] ;
23+ }
24+ return recurse ( n ) ;
25+ } ;
Original file line number Diff line number Diff line change 1+ /**
2+ * 시간 복잡도:
3+ * preIdx를 이용하여 중위 순회 배열에서 루트 노드를 기준으로 왼쪽 서브 트리와 오른쪽 서브 트리를 탐색.
4+ * 각 서브 트리를 재귀적으로 생성하며 모든 노드를 한 번씩 순회하므로, 시간 복잡도는 O(n)
5+ * 공간 복잡도:
6+ * 중위 순회 배열의 길이만큼 맵을 생성하므로, 공간 복잡도는 O(n)
7+ */
8+ /**
9+ * Definition for a binary tree node.
10+ * function TreeNode(val, left, right) {
11+ * this.val = (val===undefined ? 0 : val)
12+ * this.left = (left===undefined ? null : left)
13+ * this.right = (right===undefined ? null : right)
14+ * }
15+ */
16+ /**
17+ * @param {number[] } preorder
18+ * @param {number[] } inorder
19+ * @return {TreeNode }
20+ */
21+ var buildTree = function ( preorder , inorder ) {
22+ let preIdx = 0 ;
23+ const inorderMap = new Map ( inorder . map ( ( e , i ) => [ e , i ] ) )
24+
25+ const dfs = ( l , r ) => {
26+ if ( l > r ) {
27+ return null ;
28+ }
29+ let root = preorder [ preIdx ] ;
30+ preIdx ++ ;
31+
32+ let rootIdx = inorderMap . get ( root ) ;
33+
34+ const node = new TreeNode ( root ) ;
35+ node . left = dfs ( l , rootIdx - 1 ) ;
36+ node . right = dfs ( rootIdx + 1 , r ) ;
37+ return node ;
38+ }
39+ return dfs ( 0 , inorder . length - 1 )
40+ } ;
Original file line number Diff line number Diff line change 1+ /**
2+ * 시간 복잡도:
3+ * s와 t의 길이만큼 각 문자의 카운트를 기록하고 이를 확인하므로, 시간 복잡도는 O(n)
4+ * 공간 복잡도:
5+ * 카운트 객체는 최대 s와 t의 길이만큼 공간을 차지하므로, 공간 복잡도는 O(n)
6+ */
7+ /**
8+ * @param {string } s
9+ * @param {string } t
10+ * @return {boolean }
11+ */
12+ var isAnagram = function ( s , t ) {
13+ if ( s . length !== t . length ) {
14+ return false ;
15+ }
16+
17+ const count = { } ;
18+ for ( let i = 0 ; i < s . length ; i ++ ) {
19+ count [ s [ i ] ] = ( count [ s [ i ] ] || 0 ) + 1 ;
20+ count [ t [ i ] ] = ( count [ t [ i ] ] || 0 ) - 1 ;
21+ }
22+
23+ for ( const key in count ) {
24+ if ( count [ key ] !== 0 ) {
25+ return false ;
26+ }
27+ }
28+ return true ;
29+ } ;
You can’t perform that action at this time.
0 commit comments