题意:

image.png

解题思路:

  1. 思路:(二分) O(logn)
  2. * 如果 nums[i-1] < nums[i],则如果 nums[i-1], nums[i], ... nums[n-1] 是单调的,则 nums[n-1]就是峰值;
  3. * 如果nums[i-1], nums[i], ... nums[n-1]不是单调的,则从 i 开始,第一个满足 nums[i] > nums[i+1]的 i 就是峰值;所以 [i,n1] 中一定包含一个峰值;
  4. * 如果 nums[i-1] > nums[i],同理可得 [0,i1] 中一定包含一个峰值;
  5. * 每次二分中点,判断nums[i-1]和nums[i]的大小关系来确定左右两边哪边有峰值,从而来缩小一半的检索区间;

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer[] $nums
  4. * @return Integer
  5. */
  6. function findPeakElement($nums) {
  7. $l = 0;
  8. $r = count($nums) - 1;
  9. while ($l < $r) {
  10. $m = $l + floor(($r - $l) >> 1);
  11. if ($nums[$m] > $nums[$m + 1]) {
  12. $r = $m;
  13. } else {
  14. $l = $m + 1;
  15. }
  16. }
  17. return $l;
  18. }
  19. function findPeakElementOn($nums) {
  20. $n = count($nums) - 1;
  21. for ($i = 1; $i <= $n; $i++) {
  22. if ($nums[$i] < $nums[$i - 1]) return $i - 1;
  23. }
  24. return $n;
  25. }
  26. }

GO代码实现:

  1. func findPeakElement(nums []int) int {
  2. l, r := 0, len(nums) - 1
  3. for l < r {
  4. m := l + (r - l) >> 1
  5. if nums[m] > nums[m + 1] {
  6. r = m
  7. } else {
  8. l = m + 1
  9. }
  10. }
  11. return l
  12. }

C++代码实现:

  1. class Solution {
  2. public:
  3. int findPeakElement(vector<int>& nums) {
  4. int l = 0, r = nums.size() - 1;
  5. while (l < r) {
  6. int mid = l + r >> 1;
  7. if (nums[mid] > nums[mid + 1]) r = mid;
  8. else l = mid + 1;
  9. }
  10. return r;
  11. }
  12. };