峰值元素是指其值大于左右相邻值的元素。
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。
数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞。
示例 1:
输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。
示例 2:
输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6。
答案:
1public int findPeakElement(int[] nums) {
2 for (int i = 1; i < nums.length; i++) {
3 if (nums[i] < nums[i - 1]) {
4 return i - 1;
5 }
6 }
7 return nums.length - 1;
8}
解析:
代码很容易理解,如果当前值比前一个大,则继续寻找下一个,直到下一个比它小的为止,因为前一个是比他小的,当后一个再比它小的时候,他就是峰值。我们还可以通过二分法的方式来查找
1public int findPeakElement(int[] nums) {
2 int low = 0;
3 int high = nums.length - 1;
4 while (low < high) {
5 int mid1 = (low + high) / 2;
6 int mid2 = mid1 + 1;
7 if (nums[mid1] < nums[mid2])
8 low = mid2;
9 else
10 high = mid1;
11 }
12 return low;
13}
这个如果能看懂,也算是半个高手了,每次比较的时候都是拿中间的值和中间的下一个值进行比较,然后再缩小查找数组的范围,每次缩小的结果是要么high比它右边的大,要么low比它左边的大,直到low等于high的时候,我们可以说low比它左边相邻的大,并且比它右边相邻的也大。或者我们也可以使用递归的方式
1public int findPeakElement(int[] nums) {
2 return Helper(nums, 0, nums.length - 1);
3}
4
5int Helper(int[] nums, int low, int high) {
6 if (low == high)
7 return low;
8 int mid1 = (low + high) / 2;
9 int mid2 = mid1 + 1;
10 if (nums[mid1] > nums[mid2])
11 return Helper(nums, low, mid1);
12 else
13 return Helper(nums, mid2, high);
14}