File tree Expand file tree Collapse file tree 2 files changed +99
-0
lines changed
search-in-rotated-sorted-array Expand file tree Collapse file tree 2 files changed +99
-0
lines changed Original file line number Diff line number Diff line change 1+ from typing import Optional
2+
3+
4+ class TreeNode :
5+ def __init__ (self , val , left = None , right = None ):
6+ self .val = val
7+ self .left = left
8+ self .right = right
9+
10+
11+ """
12+ - L/R 노드의 위치 변경 반복 - 재귀/반복
13+ - 트리 순회: 반복문->BFS(Queue)
14+ 1. 큐에 현재 노드 추가
15+ 2. 큐에서 노드 꺼냄
16+ 3. 꺼낸 노드의 왼쪽<->오른쪽 자식 위치 변경
17+ 4. 위치를 바꾼 자식 노드들이 있다면, 다시 큐에 삽입
18+ 5. 큐가 빌 때까지 반복
19+ """
20+
21+ from collections import deque
22+
23+
24+ class Solution :
25+ def invertTree (self , root : Optional [TreeNode ]) -> Optional [TreeNode ]:
26+
27+ if not root :
28+ return
29+
30+ que = deque ([root ])
31+
32+ while que :
33+ node = que .popleft ()
34+
35+ # 노드의 왼쪽과 오른쪽 자식 교환
36+ node .left , node .right = node .right , node .left
37+
38+ # 바꾼 자식 노드들이 있으면 큐에 추가 (하나만 있거나 없는 경우 처리)
39+ if node .left :
40+ que .append (node .left )
41+ if node .right :
42+ que .append (node .right )
43+
44+ return root
Original file line number Diff line number Diff line change 1+ """
2+ # Intuition
3+
4+ possibly left rotated at an unknown index k → 회전된 배열, 이 조건이 있는 이유?
5+
6+ 시간 복잡도 O(logn)
7+ → 데이터의 크기가 커질수록 처리 시간이 매우 느리게 증가 - 탐색에 자주 사용됨
8+ → 어떤 알고리즘을 사용해야 하는가?
9+
10+ 회전으로 인해 배열 전체가 정렬되어 있지 않지만(두개의 정렬된 배열), O(logn)의 성능을 유지하면서 target을 찾으려면?
11+
12+
13+ # Approach
14+
15+ *회전된 배열 → 중앙값을 기준으로 배열을 나눴을 때, 최소한 한쪽 절반은 정렬되어 있음.
16+ *(예시에서) nums[low](4) < nums[mid](7) 이므로 왼쪽 부분배열은 정렬되어 있음.
17+
18+ N → N/2
19+ 1. 어느 쪽이 정렬되어 있는가?
20+ 2. target이 그 안에 포함되는가?
21+ """
22+
23+ from typing import List
24+
25+
26+ class Solution :
27+ def search (self , nums : List [int ], target : int ) -> int :
28+
29+ low , high = 0 , len (nums ) - 1
30+
31+ while low <= high :
32+ # mid = low + (high - low) // 2
33+ mid = (low + high ) // 2
34+
35+ if nums [mid ] == target :
36+ return mid
37+
38+ # 왼쪽이 정렬된 경우
39+ if nums [low ] <= nums [mid ]:
40+
41+ # target 확인
42+ if nums [low ] <= target and target < nums [mid ]:
43+ high = mid - 1
44+ else :
45+ low = mid + 1
46+
47+ # 오른쪽이 정렬된 경우 (nums[mid] < nums[high])
48+ else :
49+
50+ if nums [mid ] < target and target <= nums [high ]:
51+ low = mid + 1
52+ else :
53+ high = mid - 1
54+
55+ return - 1
You can’t perform that action at this time.
0 commit comments