diff --git a/lowest-common-ancestor-of-a-binary-search-tree/aa601.py b/lowest-common-ancestor-of-a-binary-search-tree/aa601.py new file mode 100644 index 000000000..bc5335384 --- /dev/null +++ b/lowest-common-ancestor-of-a-binary-search-tree/aa601.py @@ -0,0 +1,22 @@ +''' +TC: O(h) (h는 트리의 높이) +SC: O(1) +풀이 방법: 이진 탐색 트리의 성질을 이용해서 + p,q의 값이 현재 노드 사이에 있거나 p,q의 값 중 하나라도 현재 노드와 같을 때까지 탐색한다 +''' +# Definition for a binary tree node. +# class TreeNode: +# def __init__(self, x): +# self.val = x +# self.left = None +# self.right = None + +class Solution: + def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': + while root: + if p.val < root.val and q.val < root.val: + root = root.left + elif p.val > root.val and q.val > root.val: + root = root.right + else: + return root diff --git a/maximum-depth-of-binary-tree/aa601.py b/maximum-depth-of-binary-tree/aa601.py new file mode 100644 index 000000000..c41bfb8a5 --- /dev/null +++ b/maximum-depth-of-binary-tree/aa601.py @@ -0,0 +1,12 @@ +''' +TC: O(n) +SC: O(n) +''' + +class Solution: + def maxDepth(self, root: Optional[TreeNode]) -> int: + # 재귀함수 호출 시 노드가 존재하지 않을 때 탈출한다 + if not root: + return 0 + # root를 기준으로 왼쪽 서브트리, 오른쪽 서브트리를 재귀호출로 쌓아놓고 리프노드부터 세면서 트리의 깊이를 구한다 + return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1 diff --git a/meeting-rooms/aa601.py b/meeting-rooms/aa601.py new file mode 100644 index 000000000..b78d663c0 --- /dev/null +++ b/meeting-rooms/aa601.py @@ -0,0 +1,32 @@ +''' +TC: O(nlogn) +SC: O(1) +풀이 방법: 구간 중 첫번째 인자에 대해 정렬한 뒤, 이웃한 인자에 대해서만 겹치는지 확인한다 + 시간 복잡도는 정렬에 드는 nlogn만큼 필요하다 +''' + +from typing import ( + List, +) +from lintcode import ( + Interval, +) +""" +Definition of Interval: +class Interval(object): + def __init__(self, start, end): + self.start = start + self.end = end +""" + +class Solution: + """ + @param intervals: an array of meeting time intervals + @return: if a person could attend all meetings + """ + def can_attend_meetings(self, intervals: List[Interval]) -> bool: + intervals.sort(key=lambda x: x.start) + for i in range(1, len(intervals)): + if intervals[i - 1].end > intervals[i].start: + return False + return True