题解 | #寻找峰值#
寻找峰值
https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76
思路:
- 整体上的思路还是二分查找,核心就是考察的边界条件的判断,比如:左边界,右边界的判断,注意:不要出现的数据越界的情况。
- 第一次写右边界判断的时候,写成了mid + 1 >= nums.length && mid - 1 >= low && nums[mid - 1] < nums[mid],导致case:[3,6] 返回的结果是-1 ,原因是第二次判断的时候,mid = low=high, 此时mid-1>=low的条件就不满足,需要改成 mid-1>0,就满足条件了。
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ public int findPeakElement (int[] nums) { // write code here if (nums.length == 1) { return 0; } int low = 0; int high = nums.length - 1; return search1(nums, low, high); } private int search1(int[] nums, int low, int high) { if (low > high) { return -1; } int mid = (low + high) / 2; //左边界 if (mid - 1 < 0 && mid + 1 <= nums.length-1 && nums[mid + 1] < nums[mid]) { return mid; } //右边界 if (mid + 1 >= nums.length && mid - 1 >= 0 && nums[mid - 1] < nums[mid]) { return mid; } if (mid - 1 >= 0 && mid + 1 < nums.length && nums[mid - 1] < nums[mid] && nums[mid] > nums[mid + 1]) { return mid; } int result1 = search1(nums, low, mid - 1); if (result1 != -1) { return result1; } int result2 = search1(nums, mid + 1, high); if (result2 != -1) { return result2; } return -1; } }