zoukankan      html  css  js  c++  java
  • 二分模板

    二分分为二分查找和二分答案。

    二分查找。实际上就是一个有序数列中有一个解,然后搜一遍求这个解。而直接for循环暴搜一遍的话时间复杂度是On),而用二分查找可以降低时间复杂度,为Ologn);而数组形象化出来的话就是00000100000000为无解,1为有解),二分就是要找中间的1,即为唯一解。所以开始lr设为一定是无解的部分,代码如下。

    int search(int key) 
    {
    	int l = 0, r = n + 1  //一定无解
    	while(l + 1 < r)
    	{
       		int mid = (l + r) >> 1;
       		if(a[mid] == key) return mid;//找到了
       		if(a[mid] > key) r = mid;		
       		else l = mid; 		
    	}
    	return -1;
    }
    

     

    注:如果求函数解析式的值,只用改while条件是 r-l小于题目最小精度再小两个精度

    二分答案是二分查找的推广,即是有很多个解,然后寻找最优解。

    一般求最大值就是就是1111100000000。此时r仍然是一定无解,而l则是一定有解的边界(即数组的最小下标),最后输出l

     最小值则返过来是00001111,此时l是无解,r是有解,最后输出r

    下面是1111000情况的代码

    int l = 1, r = n + 1;
    while(l + 1 < r)
    {
       int mid = (l + r) >> 1;
       if(!check(mid)) r=mid; //表示mid不符合题目要求,无解
       else l=mid; 
    }
    //最终l为解 
    
    

    题目中的运用一般分三类,一是查找某个元素是否存在用二分优化复杂度(前提是有序,要先排序),二是计算函数取值三是枚举最优解。这三种用法的写法有区别,要注意区分。二分答案用的比较多,一般是在比较midkey的地方做了手脚,根据题目写个checkmid)函数即可。

     

  • 相关阅读:
    缩略图(转载)
    MarteEngine tutorial:Keyboard and mouse input
    MarteEngine tutorial: Hello World
    FengGUI
    位于两个内网的结点A和B都连接到一个公网的rdv,然后A与B之间发送消息,这时消息是否还经过rdv?
    MarteEngine
    MarteEngine tutorial:Basic collision
    关于PresenceService的实现方式
    MarteEngine: Animate sprite
    MarteEngine tutorial: 设置你的环境
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819544.html
Copyright © 2011-2022 走看看