有单调性的题目一定可以二分,没有单调性的可能可以二分,二分和单调性没有直接关系。
整数二分的本质是边界,整个区间可以一份为二,一半满足一半不满足,则二分即可以找前一半的边界,也可以找后一半的边界。
一般地,整数二分有两个模板,根据所搜寻的边界点是在左边还是右边进行区分。
#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