文章目录
- 题目描述
- 算法原理
- 解法一:暴力查找
- 解法二:二分查找
- 代码实现
- 解法一:暴力查找
- 解法二: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;
else
right = mid - 1;
}
return left;
}
}