二分法总结
(本篇为我的一次正式的博客,还有很多写的不好的地方请海涵)
1(在一个有序的数组找查某个元素)
int binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while(left <= right) { //注意符号/*这样写有可能发生溢出的状态建议写为 mid=left+(right-left)>>1;
int mid = (right + left) / 2; if(nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1; // 注意
else if (nums[mid] > target)
right = mid - 1; // 注意
}
return -1;}
123456789101112
2如果有多个元素重复出现查找它的位置
1寻找下界
int lower_bound(int l, int r){ while (l < r) {
int mid =( l + r) >> 1;
if (a[mid]>=y)
{ r = mid;
else l = mid + 1; }
return l;}12345
2寻找上界
`int upper_bound(int l, int r)
{ while (l < r)
{ int mid = (l + r ) >> 1;
if (a[mid]<=y) l = mid+1;
else r = mid ; }
return l;}`12345
关键在于理解这2段操作,其实很简单。取极限情况,考察相等的情况,看相等的值可不可能是解即可。
1可取则不加1;
2不可取则加1;
练习题:hdu Can you find it?
4非单调数组(连续的数)中的查找(函数中的2分查找)//我认为最简单的一种,关键就是要注意精度
while(r-l>=eps)
{ mid = (l+r)/2;
if(fx(mid)<V)
l = mid;
else r = mid; }
12345
练习题:hdu Strange fuction*
5一个数据能把一段数据切分为2种状态的情况,例如大于或等于18岁为成年人,小于18岁就为未成年,18这个数据把人类的年龄这一段数据切分为了2种状态。
2种板子
int bsearch_1(int l, int r){
while (l < r)
{ int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1; }
return l;}
int bsearch_2( int l, int r)
{ while (l < r)
{ int mid =( l + r + 1) >> 1;。//避免陷入死循环
if (check(mid)) l = mid;
else r = mid - 1; }
return l;}
123456789101112
同样也是考察极限状况,要记住mid的不同取值。
练习题:hdu Cable master, Pie ;
总的来说2分法较为简单,注意+1于-1,注意精度,就能ac;

浙公网安备 33010602011771号