162. 寻找峰值

mac2024-01-25  31

题目: 峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞。

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

思路: 用二分即可

#!/usr/bin/env python3.6 # _*_coding:utf-8 _*_ # @Time : 2019/10/30 22:28 # @Author : Grey class Solution: def findPeakElement(self, nums: List[int]) -> int: n = len(nums) if n <= 1: return 0 def findPeak(x, y): m = (x + y) // 2 if m > 0 and m < n-1: if nums[m] > nums[m-1] and nums[m] > nums[m+1]: return m elif m == 0 and nums[m] > nums[m+1]: return 0 elif m == n-1 and nums[m] > nums[m-1]: return n-1 ans = n if y-x >= 1: ans = findPeak(m+1, y) if ans != n: return ans if y-x > 1: ans = findPeak(x, m) return ans return findPeak(0, n-1)

与题解不同的是,我每次直接判断m是否峰值,而由于只需要返回其中一个峰值的位置,题解直接判断nums[m]是否大于nums[m+1],若是则在左区间找,反之则在右区间找,因为峰值必会有左递增右递减,而边界都假设为负无穷,这样更简单一些。

最新回复(0)