首页 > 其他分享 >整数二分的边界条件

整数二分的边界条件

时间:2023-03-08 23:36:44浏览次数:39  
标签:二分 target int mid 整数 边界条件 边界

 

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

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

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

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

};

 

标签:二分,target,int,mid,整数,边界条件,边界
From: https://www.cnblogs.com/luxiayuai/p/17196694.html

相关文章