java吕局部峰值_[LeetCode] Find Peak Element 求数组的局部峰值

本文介绍了如何解决LeetCode上的Find Peak Element问题,即在一个数列中找到局部峰值,允许使用二分查找法或者从第二个元素开始遍历来寻找。提供了C++和Java两种语言的解法,包括两种不同的思路:一种通过比较中间元素与其右侧元素,另一种通过逐个比较相邻元素来找出局部峰值。
摘要由CSDN通过智能技术生成

A peak element is an element that is greater than its neighbors.

Given an input array where num[i] ≠ num[i+1], find a peak element and return its index.

The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.

You may imagine that num[-1] = num[n] = -∞.

For example, in array [1, 2, 3, 1], 3 is a peak element and your function should return the index number 2.

Credits:

Special thanks to @ts for adding this problem and creating all test cases.

这道题是求数组的一个峰值,这个峰值可以是局部的最大值,这里用遍历整个数组找最大值肯定会出现Time Limit Exceeded,我们要考虑使用类似于二分查找法来缩短时间,由于只是需要找到任意一个峰值,那么我们在确定二分查找折半后中间那个元素后,和紧跟的那个元素比较下大小,如果大于,则说明峰值在前面,如果小于则在后面。这样就可以找到一个峰值了,代码如下:

C++ 解法一:

classSolution {public:int findPeakElement(vector&nums) {int left = 0, right = nums.size() - 1;while (left

}returnright;

}

};

Java 解法一:

public classSolution {public int findPeakElement(int[] nums) {int left = 0, right = nums.length - 1;while (left

}returnright;

}

}

下面这种解法就更加的巧妙了,由于题目中说明了局部峰值一定存在,那么实际上可以从第二个数字开始往后遍历,如果第二个数字比第一个数字小,说明此时第一个数字就是一个局部峰值;否则就往后继续遍历,现在是个递增趋势,如果此时某个数字小于前面那个数字,说明前面数字就是一个局部峰值,返回位置即可。如果循环结束了,说明原数组是个递增数组,返回最后一个位置即可,参见代码如下:

C++ 解法二:

classSolution {public:int findPeakElement(vector&nums) {for (int i = 1; i < nums.size(); ++i) {if (nums[i] < nums[i - 1]) return i - 1;

}return nums.size() - 1;

}

};

Java 解法二:

public classSolution {public int findPeakElement(int[] nums) {for (int i = 1; i < nums.length; ++i) {if (nums[i] < nums[i - 1]) return i - 1;

}return nums.length - 1;

}

}

本文转自博客园Grandyang的博客,原文链接:求数组的局部峰值[LeetCode] Find Peak Element,如需转载请自行联系原博主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值