整数二分的边界条件

有单调性的题目一定可以二分,没有单调性的可能可以二分,二分和单调性没有直接关系。

整数二分的本质是边界,整个区间可以一份为二,一半满足一半不满足,则二分即可以找前一半的边界,也可以找后一半的边界。

一般地,整数二分有两个模板,根据所搜寻的边界点是在左边还是右边进行区分。

复制代码
#include<iostream>

using namespace std;

const int N = 100010;

int n, m;
int q[N];

int main(){
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i ++ ){
        scanf("%d", &q[i]);
    }
    while(m--){
        int x;
        scanf("%d", &x);
        
        int l = 0, r = n - 1;
     //一下是以边界条件为区分的,两个二分模板
while(l < r){ int mid = l + r >> 1; if(q[mid] >= x) r = mid; else l = mid + 1; } if(q[l] != x) cout << "-1 -1" << endl; else{ cout << l << ' '; int l = 0, r = n - 1; while(l < r){ int mid = l + r + 1>> 1; if(q[mid] <= x) l = mid; else r = mid - 1; } cout << l << endl ; } } return 0; }
复制代码

在剑指4 二维数组的查找中,有一种解法是借助二分去优化,但特别要注意其边界条件。由于是寻找每行中等于target的数,因此边界其实有三种情况,一种是左边界,左边界及其左边的数都小于target,一种是右边界,其右边的数都大于target,在左右边界中间还有等于target的数。

复制代码
class Solution {
public:
    bool binary_search(vector<int> arr,int target){//二分查找函数
        int left = 0,right = arr.size()-1;
               while(left<=right)
                {
                    int mid = (left+right)/2;
                    if(arr[mid] == target) return true;//找到了
                    else if(arr[mid] < target) left = mid+1;//往右边遍历
                    else right = mid-1;//往左边遍历
                }
                return false;
        }
    bool Find(int target, vector<vector<int> > array) {
        for(auto i : array)//c++11语法,逐行遍历;
        {
            if(binary_search(i,target)) return true;//在本行二分找到了目标值
        }
        return false;
   }

};
复制代码

 

posted @   luxiayuai  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示