寻找峰值
要求:
思路:
- 由于时间负责度需要是O(logn\log_nlogn),所以选择了分治法进行查找
- 由于给出的函数形式不满足递归的需求,创建新函数
- 递归函数,判断递归截止条件:l>r
- 对中间索引的值进行条件判断,
- 符合峰值条件,返回索引
- 否则,递归调用左边区间,并将返回值存储在target中,使用三目运算符决定返回值,如果左边区间返回值为-1,那么右边返回值决定了是否有峰值:为-1,则左右均为-1,无峰值;否则,峰值出现在右边区间,返回即可。如果左边区间不为-1,那么直接返回该峰值对应索引即可。
- 递归结束
class Solution {
public int findPeakElement(int[] nums) {
if (nums.length<=1) return 0;
return findPeakElement(nums,0,nums.length-1);
}
private int findPeakElement(int[] nums,int l,int r) {
if (l>r) return -1;
int mid = (l+r)>>1;
if (mid==0&&nums[mid]>nums[1]) return mid;
else if (mid==nums.length-1&&nums[mid]>nums[mid-1]) return mid;
else if (mid>0&&mid<nums.length-1&&nums[mid]>nums[mid-1]&&nums[mid]>nums[mid+1]) return mid;
else {
int target = findPeakElement(nums,l,mid-1);
return target!=-1?target:findPeakElement(nums,mid+1,r);
}
}
}