|
@@ -0,0 +1,50 @@
|
|
|
+package main
|
|
|
+
|
|
|
+func findPeakElement(nums []int) int { // Return peak index
|
|
|
+ length := len(nums)
|
|
|
+ if length == 1 {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ beg, end := 0, length-1 // Index is important
|
|
|
+ mid := (beg + end) / 2
|
|
|
+ for beg < end {
|
|
|
+ midLeft := (beg + mid) / 2
|
|
|
+ if nums[midLeft] > nums[mid] {
|
|
|
+ end = mid
|
|
|
+ mid = midLeft
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ midRight := (mid + end) / 2
|
|
|
+ if nums[midRight] > nums[mid] {
|
|
|
+ beg = mid
|
|
|
+ mid = midRight
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if mid == midRight {
|
|
|
+ break // Avoid infinity loop
|
|
|
+ }
|
|
|
+ beg = midLeft
|
|
|
+ end = midRight
|
|
|
+ }
|
|
|
+ if end > length-1 || nums[mid] > nums[end] {
|
|
|
+ return mid
|
|
|
+ }
|
|
|
+ return end
|
|
|
+}
|
|
|
+
|
|
|
+// func main() {
|
|
|
+// println(findPeakElement([]int{
|
|
|
+// 1, 2, 1, 3, 5, 6, 4}))
|
|
|
+// println(findPeakElement([]int{
|
|
|
+// 1, 2}))
|
|
|
+// println(findPeakElement([]int{
|
|
|
+// 1, 2, 1, 3, 2, 1}))
|
|
|
+// println(findPeakElement([]int{
|
|
|
+// 1, 2, 3, 1, 2, 1}))
|
|
|
+// println(findPeakElement([]int{
|
|
|
+// -67, -60, 78, 31, -24, -78, -89, 14, -18, 39, // 0~9
|
|
|
+// -4, 60, -33, 77, 48, 22, 88, -40, -83, 25, // 10~19
|
|
|
+// -55, 68, 61, -72, -77, 8, -11, 90, -75, -86, // 20~29
|
|
|
+// -85, -66, -79, 26, 30, 32, 81, 27, 12, 86, // 30~39
|
|
|
+// 23, -41, 20, -58, 57, 10, 54, -27, -63, -94})) // 40~49
|
|
|
+// }
|