寻找峰值--学会处理越界问题

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寻找峰值--学会处理越界问题相关的知识,希望对你有一定的参考价值。

文章目录

题目


OJ平台

解题代码

啥也不用说,就是二分秒杀

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
        }
    }
}

以上是关于寻找峰值--学会处理越界问题的主要内容,如果未能解决你的问题,请参考以下文章

Lintcode 75.寻找峰值

LeetCode 162. 寻找峰值c++/java详细题解

LeetCode第162题—寻找峰值—Python实现

LeetCode第162题—寻找峰值—Python实现

162. 寻找峰值

非有序的二分162. 寻找峰值