此题,一看就可以知道能采用先寻找最大值的方式,然后遍历找到最大值的下标来求解,但是这样就不符合出题人的本意了
class Solution {
public int findPeakElement(int[] nums) {
//jdk 8 新特性 stream。获得数组的最大值
int max = Arrays.stream(nums).max().getAsInt();
//遍历找到最大值下标
int sout =0;
for(int i = 0;i<nums.length;i++){
if(max==nums[i]){
sout = i;
break;
}
}
return sout;
}
}
此题真正的解法应该是利用二分法
class Solution {
public int findPeakElement(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left < right) {
int mid = left + (right - left)/2;
if (nums[mid] < nums[mid + 1]) left = mid + 1;
else right = mid;
}
return left;
}
}
灵魂代码
if (nums[mid] < nums[mid + 1]) left = mid + 1;
else right = mid;
意思是,找到大数赋值给left,如果mid>mid+1,就缩小右边界的值,进而间接缩小mid值。
最终left的值就是最大值。直接返回left即可