162. Find Peak Element 发表于 2022-02-05 1234567891011121314151617181920class Solution { public int findPeakElement(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) { // 注意此处使用 left < right 能够保证最后一次 while 时存在两个元素,此时可以安全地访问 nums[mid + 1] int mid = (left + right) >>> 1; if (nums[mid] < nums[mid + 1]) { left = mid + 1; } else { // 题目说明了相邻元素不相等 // nums[mid] > nums[mid + 1] right = mid; } } // 如果最后元素为 [5, 3], mid 向下取整,指向 5, 那么 right 会被赋值为 mid 且跳出循环,此时 left 指向的 5 为峰值元素 // 如果最后元素为 [3, 5], mid 向下取整,指向 3, 那么 left 会加一指向 5 且跳出循环,此时 left 指向的 5 为峰值元素 return left; }} 难点在于与相邻值比较,而不是与端点值比较。注意题目说明了 nums[i] != nums[i + 1],即相邻的元素值不可能相等,所以无需处理相等的情况。 162. Find Peak Element