[헷갈리는 알고리즘 다시 정리 + 노션 백업용]
O(logN)
class Solution:
def search(self, nums: List[int], target: int) -> int:
#초기설정
left = 0
right = len(nums)-1
mid = (left+right)//2
#mid가 left나 right중 하나라도 만날 때까지 돌림
while mid != left and mid != right:
if target > nums[mid]:
left = mid
mid = (left+right)//2
else:
right = mid
mid = (left+right)//2
#left와 right중에 target이 존재하면 해당 인덱스 리턴, 없으면 탐색 실패(-1)
if nums[left] == target:
return left
elif nums[right] == target:
return right
else:
return -1
class Solution:
def mySqrt(self, x: int) -> int:
left = 0
right = x
while right>=left: # 종료 조건
mid = (left + right)//2
if mid*mid<=x:
left = mid+1
else:
right = mid-1 # 이미 mid를 검사했으므로 범위에서 제외
return right # 끝나고도 남아있다면 right이 반환값(마지막 m값)
O(N)
왼-중앙-오 순으로 방문
왼쪽 SubTree를 이루는 모든 노드는 부모 노드보다 작거나 같음
오른쪽 SubTree를 이루는 모든 노드는 부모 노드보다 크거나 같음
가장 왼쪽 아래 노드로부터 시작하여 가장 오른쪽 아래 노드로 끝남
중위 순회 예제 - subtree validation
https://leetcode.com/problems/validate-binary-search-tree/description/
class Solution:
def isValidBST(self, root: Optional[TreeNode]) -> bool:
# 중위순회 문제 - 중위순회하여 노드의 값을 나열했을 때 오름차순 보장해야 함
arr = []
def inorder(v):
if not v: return None
inorder(v.left)
arr.append(v.val)
inorder(v.right)
inorder(root)
return arr == sorted(list(set(arr))) # 숫자가 겹치면 요구사항을 만족하지 않으므로 Set
left is None and right is None 일 때 동작하도록 (X)
노드 자체가 None일때 동작을 하지 않게 해서 깔끔하게 구현 (O)
O(N)
모두 큐에 삽입
하고 visited 처리초기화 - 루트 노드 큐에 삽입
반복 탈출 조건 - 큐가 비는 순간
각 자식 노드가 visited에 이미 추가되어 있는지를 확인할 필요가 없음 - null이 아니라면 무조건 추가
예제1. 노드 개수 세기
방법1) BFS + 큐 사용
from collections import deque
# DFS, deque
class Solution:
def countNodes(self, root: Optional[TreeNode]) -> int:
# 예외
if not root:
return 0
count = 0
visited = deque([root])
while visited:
v = visited.popleft()
count += 1
if v.left: visited.append(v.left)
if v.right: visited.append(v.right)
return count
DFS, BFS 상관 없음
DFS
BFS
DFS
BFS