当前位置: 首页 > 后端技术 > Java

牛客网高频算法习题系列-BM19-找峰

时间:2023-04-01 21:47:16 Java

牛客网高频算法习题系列-BM19-找峰问题描述给定一个长度为n的数组nums,求出峰值并返回其索引。该数组可能包含多个峰,在这种情况下返回任何一个峰的位置就足够了。峰值元素是其值严格大于其左右邻居的元素。严格大于即不能等于假设nums[-1]=nums[n]=-\infty?∞对于所有有效的i和nums[i]!=nums[i+1]你可以使用O(logN)时间复杂度实施这个问题?见原题:求峰解1:数组遍历首先判断几种特殊情况:数组为空,则无峰;如果数组只有一个元素,因为它们都是负无穷大,所以第一个元素是峰;如果数组的第一个元素大于第二个元素,再加上左边的负无穷大,则第一个元素一定是峰值;如果数组的最后一个元素大于最后两个元素,再加上右边的负无穷大,那么倒数第二个元素一定是峰值。如果不存在上述特殊情况,则从数组的第二个位置开始遍历数组,判断是否为峰值。解法一:二分法原理:因为左右都是负无穷大,对于中间的元素,如果nums[mid]>nums[mid+1],即mid部分减少,加上左边的负无穷大,所以mid的左边肯定会有一个峰;类似地,如果nums[mid]nums[1]){return0;}//如果最后一位大于倒数第二位,则最后一位必须是峰值if(nums[nums.length-1]>nums[nums.length-2]){returnnums.length-1;}//如果不存在前面的特殊场景,则遍历数组中的元素,逐一判断是否为峰值for(inti=1;inums[i-1]&&nums[i]>nums[i+1]){返回i;}}返回-1;}/***二分法*原则:因为左右都是负无穷大,所以对于中间的元素,如果nums[mid]>nums[mid+1],mid部分会减少,加上左边的负无穷大,*所以mid的左边肯定会有一个峰;同样,如果nums[mid]nums[1]){return0;}//如果最后一位大于倒数第二位,则最后一位一定是峰值if(nums[nums.length-1]>nums[nums.length-2]){returnnums.length-1;}intleft=1,right=nums.length-2;while(leftnums[mid+1]){right=mid;}else{左=中+1;}}向左返回;}publicstaticvoidmain(String[]args){int[]nums={2,4,1,2,7,8,4};System.out.println(findPeakElement(nums));系统.out.println(findPeakElement2(nums));}}$1.01^{365}≈37.7834343329$$0.99^{365}≈0.02551796445$相信坚持的力量!