- 题目详述
峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 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)就知道二分法
注意得到的条件不是 i,j,mid的值,而是i,j,mid所在点的趋势
画几个图后发现,只要区间的左侧呈现上升,区间右侧呈现下降趋势( ,
),则必然有
代码:public static int findPeakElement(int[] A) {
int i=0;
int j=A.length-1;
if(A[i]>A[i+1])
{
return i;
}
if(A[j]>A[j-1])
{
return j;
}
while(i<j)
{
int mid=(i+j)/2;
if(i!=0&&A[i-1]<A[i]&&A[i]>A[i+1])
{
return i;
}
if(j!=A.length-1&&A[j-1]<A[j]&&A[j]>A[j+1])
{
return j;
}
if(A[mid-1]<A[mid]&&A[mid]>A[mid+1])
{
return mid;
}
if((i==0||A[i]<A[i+1])&&A[mid]<A[mid-1])
{
j=mid-1;
}
else if((j==A.length-1||A[j]<A[j-1])&&A[mid]<A[mid+1])
{
i=mid+1;
}
else {
j=mid-1;
}
}
return 0;
}
评价:
- 网络学习过程
思路已经是最快的了
四.Python实现