文章目录
- 题目描述
- 算法原理
- 解法一:暴力查找
- 解法二:二分查找
- 代码实现
- 解法一:暴力查找
- 解法二:C++
- Java
题目描述
题目链接:162.寻找峰值
根据题意,需要使用O(log N)的时间复杂度来解决,得出本道题可使用二分解决。
算法原理
解法一:暴力查找
遍历一遍数组,寻找最大值即可。
解法二:二分查找
寻找⼆段性:任取⼀个点 i ,与下⼀个点 i + 1 ,会有如下两种情况:
- arr[i] > arr[i + 1] :此时「左侧区域」⼀定会存在⼭峰(因为最左侧是负⽆ 穷),那么我们可以去左侧去寻找结果;
- arr[i] < arr[i + 1] :此时「右侧区域」⼀定会存在⼭峰(因为最右侧是负⽆ 穷),那么我们可以去右侧去寻找结果。
当我们找到⼆段性的时候,就可以尝试⽤⼆分查找算法来解决问题。
代码实现
解法一:暴力查找
class Solution {
public:int findPeakElement(vector<int>& nums) {//返回一个迭代器,再减去指向nums[0]的迭代器,即可得出下标return max_element(nums.begin(), nums.end()) - nums.begin();}
};
解法二:C++
class Solution {
public:int findPeakElement(vector<int>& nums) {//二段性可以用二分int left = 0,right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] > nums[mid + 1])right = mid;else left = mid + 1;}return left;}
};
Java
class Solution {public int peakIndexInMountainArray(int[] arr) {int left = 1, right = arr.length - 2;while (left < right) {int mid = left + (right - left + 1) / 2;if (arr[mid] > arr[mid - 1])left = mid;elseright = mid - 1;}return left;}
}