寻找峰值--学会处理越界问题
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找峰值--学会处理越界问题相关的知识,希望对你有一定的参考价值。
题目
解题代码
啥也不用说,就是二分秒杀
C++实现
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n = nums.size();
int l = 0,r = n-1;//为了不让mid+1越界,r取n-1
while(l<r){ // 由于当l==r时答案肯定找到了
int mid = l+((r-l)>>1);
if(nums[mid]>nums[mid+1])
r = mid; //这里同样也是左闭右开,为了让mid+1不越界。
else
l = mid+1;
}
return l;
}
};
Golang实现
func findPeakElement(nums []int) int {
l := 0; r := len(nums)-1
for l<r {
mid := (r-l)>>1+l;
if nums[mid]>nums[mid+1] {
r = mid
}else {
l = mid+1;
}
}
return l
}
官方通过实现一个get函数防止越界问题
实现了get函数后,便可以自由的比较mid-1、mid、mid+1了
CPP
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n = nums.size();
// 辅助函数,输入下标 i,返回一个二元组 (0/1, nums[i])
// 方便处理 nums[-1] 以及 nums[n] 的边界情况
// 返回一个pair的原因在于:如果仅仅通过返回int进行比较,则nums[i]可能也是INT_MIN
auto get = [&](int i) -> pair<int,int> {
if (i == -1 || i == n) {
return {0,0};
}
return {1,nums[i]};
};
int left = 0, right = n - 1, ans = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (get(mid - 1) < get(mid) && get(mid) > get(mid + 1)) {
ans = mid;
break;
}
if (get(mid) < get(mid + 1)) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
return ans;
}
};
Golang
func findPeakElement(nums []int) int {
n := len(nums)
// 辅助函数,输入下标 i,返回 nums[i] 的值
// 方便处理 nums[-1] 以及 nums[n] 的边界情况
// Golang能直接返回int_min的原因在于它返回的是64int的min
get := func(i int) int {
if i == -1 || i == n {
return math.MinInt64
}
return nums[i]
}
left, right := 0, n-1
for {
mid := (left + right) / 2
if get(mid-1) < get(mid) && get(mid) > get(mid+1) {
return mid
}
if get(mid) < get(mid+1) {
left = mid + 1
} else {
right = mid - 1
}
}
}
以上是关于寻找峰值--学会处理越界问题的主要内容,如果未能解决你的问题,请参考以下文章