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