46 lines
663 B
Go
46 lines
663 B
Go
package q33
|
|
|
|
func findK(nums []int) int {
|
|
if len(nums) < 2 || nums[0] < nums[len(nums)-1] {
|
|
return 0
|
|
}
|
|
|
|
l, r := 0, len(nums)
|
|
for l < r && nums[l] > nums[r-1] {
|
|
m := (l + r) / 2
|
|
if nums[m] > nums[r-1] {
|
|
l = m + 1
|
|
} else {
|
|
r = m + 1
|
|
l++
|
|
}
|
|
}
|
|
return len(nums) - l
|
|
}
|
|
|
|
func translate(n, k, i int) int {
|
|
if i < k {
|
|
return n + i - k
|
|
}
|
|
return i - k
|
|
}
|
|
|
|
func search(nums []int, target int) int {
|
|
k := findK(nums)
|
|
|
|
l, r := 0, len(nums)
|
|
for l < r {
|
|
m := (l + r) / 2
|
|
mt := translate(len(nums), k, m)
|
|
if nums[mt] == target {
|
|
return mt
|
|
} else if nums[mt] > target {
|
|
r = m
|
|
} else {
|
|
l = m + 1
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
var _ = search
|