-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathproblem058.go
33 lines (28 loc) · 999 Bytes
/
problem058.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
package problem058
func Search(numbers []int, targetNumber int) *int {
return modifiedBinarySearch(numbers, targetNumber, 0)
}
func getIntPointer(value int) *int {
return &value
}
func modifiedBinarySearch(numbers []int, targetNumber int, outerIndex int) *int {
if len(numbers) == 0 {
return nil
}
midIndex := (len(numbers) - 1) / 2
if targetNumber == numbers[midIndex] {
return getIntPointer(outerIndex + midIndex)
}
firstNumber, midNumber, lastNumber := numbers[0], numbers[midIndex], numbers[len(numbers)-1]
if firstNumber <= midNumber {
if firstNumber <= targetNumber && targetNumber < midNumber {
return modifiedBinarySearch(numbers[:midIndex], targetNumber, 0)
}
return modifiedBinarySearch(numbers[midIndex+1:], targetNumber, midIndex+1)
} else {
if midNumber < targetNumber && targetNumber <= lastNumber {
return modifiedBinarySearch(numbers[midIndex+1:], targetNumber, midIndex+1)
}
return modifiedBinarySearch(numbers[:midIndex], targetNumber, 0)
}
}