@@ -56,3 +56,76 @@ class Solution {
56
56
### TC, SC
57
57
58
58
시간 복잡도는 O(n)이고, 공간 복잡도는 O(1)이다.
59
+
60
+ ## 조금 더 최적화 하자면 (binary search like)
61
+
62
+ 문제에서 O(log n) 의 시간복잡도로 풀어보라고 제시하였다. log n 이 들어갔으니 트리같은 방식으로 접근을 하나? 라는 생각이 우선 들었다.
63
+
64
+ 다른 사람들의 풀이를 보니 다음과 푸는 것을 볼 수 있었다.
65
+
66
+ ``` java
67
+ public int findMin(int [] nums) {
68
+ int left = 0 , right = nums. length - 1 ;
69
+ while (left < right) {
70
+ int mid = left + (right - left) / 2 ;
71
+
72
+ if (nums[mid] < nums[right]) {
73
+ right = mid;
74
+ } else {
75
+ left = mid + 1 ;
76
+ }
77
+ }
78
+
79
+ return nums[left];
80
+ }
81
+ ```
82
+
83
+ ### case 나눠서 생각해보기
84
+
85
+ 머릿속에서 상상이 잘 가지 않아. 케이스를 나눠서 생각해보았다.
86
+
87
+ #### 1. ` [0,1,2,4,5,6,7] ` 완벽하게 정렬되어 있을 경우
88
+
89
+ - 첫번째 반복
90
+ - left:0, right: 6 → mid: 3 → right = 3
91
+ - 두번째 반복
92
+ - left:0, right: 3 → mid: 1 → right = 1
93
+ - 세번째 반복
94
+ - left:0, right: 1 → mid: 0 → right = 0
95
+ - 반복 종료
96
+ - ` return nums[0] `
97
+
98
+ #### 2. ` [6,7,0,1,2,4,5] ` 최솟값이 왼쪽에 있을 경우
99
+
100
+ - 첫번째 반복
101
+ - left:0, right: 6 → mid: 3 → right = 3
102
+ - 두번째 반복
103
+ - left:0, right: 3 → mid: 1 → right = 2
104
+ - 세번째 반복
105
+ - left:2, right: 3 → mid: 2 → right = 2
106
+ - 반복 종료
107
+ - ` return nums[2] `
108
+
109
+ #### 3. ` [4,5,6,7,0,1,2] ` 최솟값이 오른쪽에 있을 경우
110
+
111
+ - 첫번째 반복
112
+ - left:0, right: 6 → mid: 3 → left = 4
113
+ - 두번째 반복
114
+ - left:4, right: 6 → mid: 5 → right = 5
115
+ - 세번째 반복
116
+ - left:4, right: 5 → mid: 4 → right = 4
117
+ - 반복 종료
118
+ - ` return nums[4] `
119
+
120
+ #### 4. ` [1,2,4,5,6,7,0] ` 최솟값이 오른쪽 맨 끝에 있을 경우
121
+
122
+ - 첫번째 반복
123
+ - left:0, right: 6 → mid: 3 → left = 4
124
+ - 두번째 반복
125
+ - left:4, right: 6 → mid: 5 → left = 6
126
+ - 반복 종료
127
+ - ` return nums[6] `
128
+
129
+ ### TC, SC
130
+
131
+ 시간 복잡도는 O(log n)이고, 공간 복잡도는 O(1)이다.
0 commit comments