162.go 1.2 KB

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