二分法查找题目汇总~~~~~~~~~~~~

如果二分法里面的left和right都符合条件的走,那就是left<right或者等于也行,但是如果存在一个不符合条件一定要等于。
平时:
写二分法的时候就考虑两边正常走的情况!!!!如果可以的华!!!!两边都是+ - 就是等于,如果一边就是小于 就ok了。 除非不行了!
注意就是二分查找在while里面的,如果 left<right, high可以不变,但是low+1这样,而且注意到两个都是不会错过最优解,这样当low=high就是没错过最优解也是一个元素那就找到了;
注意不能 high变但是low不变,这样容易产生,low 等于mid,low一直不变就一直不走了。陷入死循环。如果题目非要是low不变才符合条件的话,那就注意下特殊情况。
比如条件变成:
在这里插入图片描述

然后下面的二分法是可以走的时候我们就按照公众号的,如果不好走就不用按照他的死板方法!

先来个小题目拿拿味~
852 .山脉数组的峰顶索引
题目:
符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。

思路1:
   找最大最小值的问题,而且涉及到排序好的数组一般用二分查找。这道题目我主要想介绍下二分查找的边界条件! 一般是l<r 针对什么!函数中r=mid,然后 l=mid+1的情况,切记不能l=mid,这样当l和r差距是1个单位的时候,先入死循环了!因为l本身就是mid!!
   还有一个情况就是 l=r的情况,针对这个情况一般是r=mid-1,l=mid+1双管齐下的,然而这种情况下其中某一条路是过度开发的,就是可能会错过最优解。这种情况一般是让r错过最优解,让r等于l,然后进一步进入左边界区域,让l=mid+1达到这个巅峰。
   下面附上这两种两份查找的代码!! 二分查找就是求mid,然后l<r然后用mid和相邻的元素进行比较,判断区间!

class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int n = arr.size();
        int left = 1, right = n - 1;
        while (left < right) {  
            int mid = (left + right) / 2;
            if (arr[mid] > arr[mid + 1]) {
               
                right = mid ;
            }
            else {
                left = mid + 1;
            }
        }
        return left;
    }
};
class Solution {
public:
    int peakIndexInMountainArray(vector<int>& arr) {
        int n = arr.size();
        int left = 1, right = n - 2, ans = 0;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (arr[mid] > arr[mid + 1]) {
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }
        return left;
    }
};

————————————————————————————————————————
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值