File tree Expand file tree Collapse file tree 4 files changed +159
-0
lines changed
maximum-depth-of-binary-tree Expand file tree Collapse file tree 4 files changed +159
-0
lines changed Original file line number Diff line number Diff line change 1+ """
2+ 풀이 :
3+ valid tree를 만족하려면 두 가지 조건이 필요하다
4+
5+ 1. 순환이 없어야 한다
6+ 2. 모든 노드가 연결되어 있어야한다
7+
8+ 이 조건을 만족하려면 (vertex 수 - 1) == edge 수 가 필수조건이다
9+ edge 수가 더 적다면 모든 노드가 연결되지 않고 더 많다면 필연적으로 순환이 존재하기 때문
10+ 위 조건으로 필터링하고 나서 모든 노드가 연결됐는지지 확인하면 valid tree를 알 수 있다
11+ 즉, 순환을 가지고 있는지 확인하는 과정이 생략된다
12+
13+ - edges를 기반으로 graph를 만든다
14+
15+ 노드 개수: N, 간선 개수: E
16+ E == N - 1을 먼저 확인하기 때문에 E는 N에 비례한다
17+ 따라서 N만 사용
18+
19+ TC: O(N)
20+ 모든 node에 대해 dfs호출, edges에 대한 순회도 node수에 비례
21+
22+ SC: O(N)
23+ dfs 호출 스택 및 graph는 node 수에 비례
24+ """
25+
26+ from typing import (
27+ List ,
28+ )
29+
30+ class Solution :
31+ """
32+ @param n: An integer
33+ @param edges: a list of undirected edges
34+ @return: true if it's a valid tree, or false
35+ """
36+ def valid_tree (self , n : int , edges : List [List [int ]]) -> bool :
37+ # write your code here
38+ if n - 1 != len (edges ) :
39+ return False
40+
41+ graph = [[] for _ in range (n )]
42+ for node , adjcent in edges :
43+ graph [node ].append (adjcent )
44+ graph [adjcent ].append (node )
45+
46+ visited = set ()
47+
48+ def dfs (node ):
49+ visited .add (node )
50+ for adj in graph [node ]:
51+ if adj not in visited :
52+ dfs (adj )
53+
54+ dfs (0 )
55+
56+ return len (visited ) == n
Original file line number Diff line number Diff line change 1+ """
2+ 풀이:
3+ 재귀함수의 탈출조건은 root가 존재하지 않을 때, return 0
4+ 그 외에는 left, right에 재귀함수를 호출하여 더 높은 값 + 1을 return 한다
5+ 가장 깊은 깊이의 maxDepth가 0을 return 하고 밑에서부터 + 1 씩 쌓여서 총 깊이를 return 할 수 있다
6+
7+ 노드의 개수: N
8+
9+ SC : O(N)
10+
11+ 모든 노드에 대해 순회
12+
13+ TC : O(N)
14+
15+ 모든 노드에 대한 재귀콜스택
16+
17+ """
18+
19+ # Definition for a binary tree node.
20+ # class TreeNode:
21+ # def __init__(self, val=0, left=None, right=None):
22+ # self.val = val
23+ # self.left = left
24+ # self.right = right
25+ class Solution :
26+ def maxDepth (self , root : Optional [TreeNode ]) -> int :
27+ if not root :
28+ return 0
29+ return max (self .maxDepth (root .left ), self .maxDepth (root .right )) + 1
Original file line number Diff line number Diff line change 1+ """
2+ 풀이 :
3+ 오름차순으로 interval을 정렬 후 ans의 마지막과 interval을 비교
4+ - 겹치는 구간이 있다면 합치고
5+ - 없다면 ans에 새로 interval을 추가한다
6+
7+ - 정렬을 쓰지 않고 풀었을 때:
8+ 이중for문으로 비교하면서 merged라는 set로 중복검사되지 않도록 유의하면서 합친다
9+ 겹치는 구간 또한 정렬되어 있지 않기 때문에 좀 더 복잡한 조건으로 비교해야함
10+
11+ interval 수 N
12+
13+ TC : O(N logN)
14+ 정렬하는데 들어가는 시간 N logN + for문 N
15+
16+ SC : O(N)
17+ sorted(intervals)는 N에 비례, 결과 배열은 최악의 경우 N과 동일일
18+ """
19+
20+
21+ class Solution :
22+ def merge (self , intervals : List [List [int ]]) -> List [List [int ]]:
23+ ans = []
24+ for interval in sorted (intervals ):
25+ if not ans :
26+ ans .append (interval )
27+ if interval [0 ] <= ans [- 1 ][1 ]:
28+ ans [- 1 ][1 ] = max (ans [- 1 ][1 ], interval [1 ])
29+ else :
30+ ans .append (interval )
31+ return ans
Original file line number Diff line number Diff line change 1+ """
2+ 풀이 :
3+ list를 순회하면서 deque에 저장하고 순차적으로 앞, 뒤에서 pop하면서 다시 잇는다
4+
5+ - 마지막 노드의 next를 None으로 할당해줄 것
6+
7+ Node 개수 : N
8+
9+ TC : O(N)
10+
11+ SC : O(N)
12+ """
13+
14+ from collections import deque
15+
16+ # Definition for singly-linked list.
17+ # class ListNode:
18+ # def __init__(self, val=0, next=None):
19+ # self.val = val
20+ # self.next = next
21+ class Solution :
22+ def reorderList (self , head : Optional [ListNode ]) -> None :
23+ """
24+ Do not return anything, modify head in-place instead.
25+ """
26+ tmp = head
27+ save = deque ()
28+
29+ while tmp :
30+ save .append (tmp )
31+ tmp = tmp .next
32+
33+ dummy = ListNode (- 1 )
34+ tmp = dummy
35+ while save :
36+ tmp .next = save .popleft ()
37+ tmp = tmp .next
38+ if (save ):
39+ tmp .next = save .pop ()
40+ tmp = tmp .next
41+ tmp .next = None
42+
43+ head = dummy .next
You can’t perform that action at this time.
0 commit comments