Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

寻找峰值 #130

Open
louzhedong opened this issue Feb 18, 2019 · 0 comments
Open

寻找峰值 #130

louzhedong opened this issue Feb 18, 2019 · 0 comments

Comments

@louzhedong
Copy link
Owner

习题

出处 LeetCode 算法第162题

峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞

示例 1:

输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5 
解释: 你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6。

说明:

你的解法应该是 O(logN) 时间复杂度的。

思路

时间复杂度限制为O(logN),所以我们采用二分法

解答

/**
 * @param {number[]} nums
 * @return {number}
 */
var findPeakElement = function (nums) {
  return helper(nums, 0, nums.length - 1);
};

function helper(nums, left, right) {
  if (right >= left) {
    var middle = Math.floor((right - left) / 2) + left;
    if (middle === 0) {
      if (nums[middle] > nums[middle + 1]) {
        return middle;
      }
    } else if (middle === nums.length - 1) {
      if (nums[middle] > nums[middle - 1]) {
        return middle;
      }
    } else {
      if (nums[middle] > nums[middle - 1] && nums[middle] > nums[middle + 1]) {
        return middle;
      }
    }
    if (right > left) {
      return helper(nums, left, middle - 1) || helper(nums, middle + 1, right) || false;
    } else {
      return false;
    }

  } else {
    return false;
  }
}

console.log(findPeakElement([1, 2]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant