题目:162. 寻找峰值
思路:
题目有一点很重要:对于所有有效的 i 都有 nums[i] != nums[i + 1]。
同时,峰值只要求大于相邻的数。
线性查找:从头开始,只需要判断是否大于下一个数;如果不大于下一个数,那么我们会继续查找,也就是说,只要来到了当前位置,就已经保证了当前位置大于前一个位置。
二分:找出中点mid,判断mid与mid+1处值的大小
如果nums[mid] > nums[mid + 1]:说明峰值在左区间,我们更新右区间为mid;
如果nums[mid] < nums[mid + 1]:说明峰值在右区间,我们更新左区间为mid+1。
代码:线性查找
class Solution {
public int findPeakElement(int[] nums) {
for (int i = 0; i < nums.length - 1; i ++) {
if (nums[i] > nums[i + 1]) {
return i;
}
}
return nums.length - 1;
}
}
代码:二分
class Solution {
public int findPeakElement(int[] nums) {
return binary(0, nums.length - 1, nums);
}
public int binary(int l, int r, int[] nums) {
if (r == l) {
return l;
}
int mid = (l + r) / 2;
if (nums[mid] > nums[mid + 1]) {
r = mid;
}
if (nums[mid] < nums[mid + 1]) {
l = mid + 1;
}
return binary(l, r, nums);
}
}

这篇博客介绍了两种寻找数组峰值元素的方法,一种是线性查找,从头遍历数组,只需判断当前位置元素是否大于下一个元素;另一种是二分查找,通过不断比较数组中间元素与它右边的元素来缩小搜索范围。这两种方法都在O(n)时间内找到峰值元素。
359

被折叠的 条评论
为什么被折叠?



