forked from DaleStudy/leetcode-study
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathflynn.go
65 lines (52 loc) ยท 1.95 KB
/
flynn.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
ํ์ด 1
- ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด์งํ์์ ์ด์ฉํ์ฌ ํ์ดํ ์ ์์ต๋๋ค
์ฃผ์ด์ง ๋ฐฐ์ด์ด A = [4,5,6,7,0,1,2] ๋ผ๊ณ ํ ๋, ์ด ๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์์ต๋๋ค
A[0:3] : rotate๋์ด ์์ผ๋ก ๋ฐฐ์ด์ ์์ผ๋ก ์ฎ๊ฒจ์ง ๋ถ๋ถ
A[4:6] : rotate๋์ด ๋ฐฐ์ด์ ๋ค๋ก ๋ฐ๋ ค๋ ๋ถ๋ถ
์ด๊ฑธ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ํํํ๋ฉด ์ด๋ ๊ฒ๋ ๋ฐ๋ผ๋ณผ ์ ์์ต๋๋ค
f(A) = [T, T, T, T, F, F, F] (T/F: rotate๋์ด ๋ฐฐ์ด์ ์์ผ๋ก ์ฎ๊ฒจ์ง ๋ถ๋ถ์ธ๊ฐ?)
์ด ๋, ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ ๊ฐ (the Minimum in the rotated sorted array)๋ ๋ ๊ตฌ๊ฐ์ ๊ฒฝ๊ณ์ ์์นํ๊ณ ์์ต๋๋ค
์ฆ, ์ฒซ๋ฒ์งธ F์ ์์น๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ก ๋ฐ๊ฟ ์๊ฐํ ์ ์๋จ ๋ป์
๋๋ค
Big O
- N: ์ฃผ์ด์ง ๋ฐฐ์ด nums์ ๊ธธ์ด
- Time complexity: O(logN)
- Space complexity: O(1)
*/
func findMin(nums []int) int {
lo, hi := 0, len(nums)-1
// rotate๊ฐ 0๋ฒ ์คํ๋ ๊ฒฝ์ฐ, ์ด์งํ์์ ์คํํ ํ์๊ฐ ์๊ณ ์ด์งํ์์ ์ด๊ธฐ๊ฐ ์ค์ ์ด ๊น๋ค๋ก์์ง๊ธฐ ๋๋ฌธ์ ์ฒ์์ ๋ฐ๋ก ์ฒ๋ฆฌํด์ค๋๋ค
// ์์ hi์ ์ด๊ธฐ๊ฐ์ ์ค์ ํ ๋, len(nums)๊ฐ ์๋ len(nums) - 1๋ก ์ค์ ํ ์ ์์๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค
if nums[lo] < nums[hi] {
return nums[lo]
}
// Go๋ while๋ฌธ์ ๋์ํ๋ ํํ์ for๋ก ์ด๋ ๊ฒ ํํํฉ๋๋ค
for lo < hi {
mid := lo + (hi-lo)/2
// ๋ง์ผ mid๊ฐ ์์ผ๋ก ๋ฐ๋ ค๋ ๋ถ๋ถ์ ์ํ๋ค๋ฉด...
if nums[lo] <= nums[mid] && nums[mid] > nums[hi] {
lo = mid + 1
} else {
hi = mid
}
}
return nums[lo]
}
/*
ํ์ด 2
- ํ์ด 1์์ ๋์ด๋ผ ์ ์๋ ๋ก์ง์ ๋์ด๋ธ ์ข ๋ ๊น๋ํ ์ด์งํ์ ํ์ด์
๋๋ค
Big O
- ํ์ด 1๊ณผ ๋์ผ
*/
func findMin(nums []int) int {
lo, hi := 0, len(nums)
for lo < hi {
mid := lo+(hi-lo)/2
if nums[mid] > nums[len(nums)-1] {
lo = mid + 1
} else {
hi = mid
}
}
return nums[lo]
}