mid函数

二分与三分

耗尽温柔 提交于 2020-03-15 21:01:47
设置越界下标确定是否存在 1 //>=x 2 while(l<r){ 3 int mid((l+r)>>1); 4 if(a[mid]>=x) r=mid; 5 else l=mid+1; 6 } 7 //<==x 8 while(l<r) 9 { 10 int mid((l+r+1)>>1); 11 if(a[mid]<=x) l=mid; 12 else r=mid-1; 13 } 14 //setprecision(3) 15 while(l+(1e-5)<r) 16 { 17 double mid=(l+r)/2; 18 if(calc(mid)) r=mid; 19 else l=mid; 20 } 21 FOR(i,0,100) 22 { 23 double mid((l+r)/2); 24 if(calc(mid)) r-mid; 25 else l=mid; 26 } 从学oi到现在,二分思想是逐渐发挥其威力的。其思想跟数学归纳法很像: 并不直接解决问题,而是将问题转化为几个相同的规模较小的问题。对于很简单的子问题(边界条件),直接给出答案。 对于高级数据结构,像线段树,平衡树都是基于二分思想 可以说,二分是算法大楼的重要根基之一。 用二分法配合基础算法打暴力,往往会有意想不到的收获。 对于有单调性的序列,二分能够在O(logn)的时间内进行查找。 具体应用: 1.

Excel基础(十五)文本函数

丶灬走出姿态 提交于 2020-03-01 06:01:46
文章目录 一.截取字符串 1.1.left() 1.2.mid() 1.3.right() 1.4.不用mid实现mid() 1.5.mid截取到最后?? 1.6.取身份证性别位 1.7.MOD求余函数 二.获取文本的信息 2.1.知道有几位?获取信息?find() 1.先找到在第几位 2.再截取 2.2.符号有多个,找到位置 2.3.找到域名,综合使用 2.4.长度函数 1.len() 2.lenb() 2.5.求单位? 1.问题的引入? 2.使用len()和lenb()? 三.身份证 3.1.前六位? 1.文本与数字的转换 2.对应表 3.2.生日 3.3.性别? 3.4.真伪? 1.身份证算法。。。 1.算出余数 2.根据余数得到最后一位 2020年2月29日 一.截取字符串 1.1.left() 取左边的多少位 =LEFT(A3,3) 1.2.mid() 取中间几位 =MID(E3,3,3) 1.3.right() 取最右的几位 =RIGHT(E3,4) 1.4.不用mid实现mid() =RIGHT(LEFT(E3,5),3) 1.5.mid截取到最后?? 参数写一百位?? =MID(A3,4,100) 1.6.取身份证性别位 =RIGHT(LEFT(B13,17)) 1.7.MOD求余函数 =MOD(D13,2) 二.获取文本的信息 2.1.知道有几位?获取信息

【LeetCode】69. x 的平方根(JAVA)

不羁的心 提交于 2020-02-10 15:56:27
原题地址: https://leetcode-cn.com/problems/sqrtx/ 题目描述: 实现 int sqrt(int x) 函数。 计算并返回 x 的平方根,其中 x 是非负整数。 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1: 输入: 4 输出: 2 示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。 解题方案: 参考: https://leetcode-cn.com/problems/sqrtx/solution/er-fen-cha-zhao-niu-dun-fa-python-dai-ma-by-liweiw/ 采用二分法的变形,上界选择x/2 +1是因为对于大部分x, x < x 2 \sqrt{x}<\dfrac{x}{2} x ​ < 2 x ​ ,例外只有0,1,2,3,而这三个数也满足 x < x 2 + 1 \sqrt{x}<\dfrac{x}{2}+1 x ​ < 2 x ​ + 1 。mid需要选择右中值是为了防止只有两个元素时陷入死循环。 代码: class Solution { public int mySqrt ( int x ) { long left = 0 , right = x / 2 + 1 , mid ; while ( left

写正确的整数二分 |oyxBlog

两盒软妹~` 提交于 2020-02-06 19:25:06
二分 第一篇二分搜索论文是 1946 年发表,然而第一个没有 bug 的二分查找法却是在 1962 年才出现,中间用了 16 年的时间。 ——不知道哪里看的 整数二分 yxc二分模板 二分的本质是二段性不是单调性。 当想找不满足性质的边界值(红色区域的右边界值) 找中间值 mid = (l+r+1)/2 if(check(mid))等于true或者是false check(m)是检查m是在 不满足性质的区间 (检查是不是在红色区间) 更新l或者r 当想找满足性质的边界值(绿色区域的左边界值) 找中间值 mid = (l+r)/2 if(check(mid))等于true或者是false check(m)是检查m是在 满足性质的区间 (检查是不是在绿色区间) 更新l或者r 归结上面的两种二分方法,步骤为: 先写一个check函数 判定在check的情况下(true和false的情况下),如何更新区间。 在check(m)==true的分支下是: l=mid 的情况,中间点的更新方式是 m=(l+r+1)/2 r=mid 的情况,中间点的更新方式是 m=(l+r)/2 这种方法保证了: 最后的 l==r 搜索到达的答案是闭区间的,即a[l]是满足check()条件的。 模板 acwing 789 //#define judge # include <bits/stdc++.h>

第四章 生成学习算法

浪尽此生 提交于 2020-02-06 12:04:56
到目前为止,我们讨论的学习算法都是以$p(y \mid x;\theta)$为模型 ,即给定x以后y的 条件分布。接下来讨论一个不同类型的学习算法。 举个例子:有一个分类问题,基于动物得而一些特征分辨它是大象(y=1)还是狗(y=0)。对于逻辑回归算法或感知算法会找出一条直线作为判别边界。这里提出一个新的方法:分别建立一个大象特征的模型和狗特征的模型、对于一个新的动物,使之与大象模型和狗的模型分别匹配,以此判断该新的动物与哪个更匹配。 判别学习算法 直接学习$p(y \mid x)$或学习输入空间X到标签{0,1}的映射 生成学习算法 以$p(x \mid y)$为模型 比如,y表示样本是大象(1)还是狗(0),则$p(x \mid y=0)$表示狗特征的分布模型。 建立$p(y)$(类的先验)和$p(x \mid y)$,使用贝叶斯准则推导出给定x以后y的分布: $p(y \mid x) = \frac {p(x \mid y)p(y)}{p(x)}$ 这里的分母可由$p(x)=p(x \mid y=1)p(y=1)+p(x \mid y=0)p(y=0)$得到。然后以我们学习得到的$p(x \mid y)$和$p(y)$来表示 实际上,计算$p(y \mid x)$时,我们并不需要计算分母,因为: $arg~~\underset{y}{max} p(y \mid x)= arg

EXCLE 使用MID函数实现快速填充年月日

微笑、不失礼 提交于 2020-02-06 00:48:11
1.我们来了解一下MID函数, 它的函数是MID(字符串,位置,个数) 我们可以用它来做些操作, 我这里有两个案例: 1.实现快速查找班级 请看图: 具体操作: 输入:=MID(A4,4,1)&“班” 可以看到选中的是第A列第四行,开始位置是4,个数是1 按住回车出现的就是3班了 当我们按住右下角往下拉是,他会自动填充的。 案列2: 实现生日的查询: 当我们输入=MID(A46,7,8)时,按回车就是一个生日,往下拉,他就自动填充了。 每天进步一小滴,就会有一大滴,可是我也渐渐老了,哎,时光啊! 来源: CSDN 作者: 笨蛋,我爱你的 链接: https://blog.csdn.net/weixin_45932157/article/details/104187981

二分

你说的曾经没有我的故事 提交于 2020-02-02 13:57:15
目录 二分 1.二分递归版本 2.二分非递归版本 三分及其应用 二分 二分是一种思想,其不仅限于查找。其中查找是一个很典型的应用。个人对二分的理解:如果一个题目告诉你最大答案范围,即在那个范围里肯定存在一个答案,那么就可以用二分(查找很典型了吧,不过查找也可以找不到,最后arr[mid]!=num to be find)。 二分查找是一种查找效率非常高的算法,时间复杂度为O(log2n)不过前提是数组提前排列好顺序,其实现代码如下: 1.二分递归版本 int binarysearch(int *arr,int key,int l,int r) { int mid=(r+l)>>1; if(l>r) return -1; else if(key==arr[mid]) return mid; else if(key>arr[mid]) return binarysearch(arr,key,mid+1,right); else if(key<arr[mid]) return binarysearch(arr,key,left,mid-1); return -1; } 2.二分非递归版本 int binarySearch1(int *a,int n,int target) { int l=1,r=n,mid; while(l<r) { mid=(l+r)>>1; if(a[mid]>

二分&三分

亡梦爱人 提交于 2020-01-31 03:39:30
二分是一个很高贵的方法。(语出实验室某大佬) 我觉得也是,二分是一种巧妙地暴力。 二分 二分法在一个单调有序的集合或函数中查找一个解,每次分为左右两部分,判断解在哪个部分中并调整上下界,直到找到目标元素,每次二分后都将舍弃一半的查找空间,因此效率很高。 若求解的问题的定义域为整数域,对于长度为N的求解区间,算法需要logn次来确定出分界点。 对于定义域在实数域上的问题,可以类似于上面的方法,判断R-L的精度是否达到要求,即R-L>=eps。 如果我们指定二分的次数t,那么对于初始的求解区间长度L,算法结束后的r-l值会为L/2^t。 二分算法的复杂度O(二分次数*单次判定复杂度)。 (以上来自ppt) 有点枯燥的干货 简单总结如下: 1.一般二分适用的题目都具有明显的单调性 2.二分的边界很重要 最后放一张大佬总结的图,模板不重要,理解二分的含义才是最重要的叭 例题~[愤怒的牛] 题目描述 农夫约翰建造了一座有n间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在xi的位置,但是约翰的m头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。 牛们并不喜欢这种布局,而且几头牛放在一个隔间里,它们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大

Aggressive cows

橙三吉。 提交于 2019-12-22 16:07:25
基本的二分题目,check()函数中对 每一个牛棚与其前一个牛棚距离和枚举的距离mid比较 , 如果大于等于mid,则可以放一头牛,最后对放的牛数量与要求放的牛数量比较 # include <bits/stdc++.h> using namespace std ; int n , c ; int a [ 1000005 ] ; int check ( int mid ) { int pre = a [ 0 ] , num = 1 ; for ( int i = 1 ; i < n ; i ++ ) { if ( a [ i ] - pre >= mid ) { num ++ ; pre = a [ i ] ; } } if ( num >= c ) return 1 ; return 0 ; } int main ( ) { int ans = 0 ; cin >> n >> c ; for ( int i = 0 ; i < n ; i ++ ) cin >> a [ i ] ; sort ( a , a + n ) ; int l = 0 , r = 1000000000 / c ; while ( l < r ) { int mid = ( l + r + 1 ) / 2 ; if ( check ( mid ) ) { l = mid ; } else r = mid -

leetcode162. 寻找峰值

断了今生、忘了曾经 提交于 2019-12-04 17:35:26
给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞。 示例 1: 输入: nums = [1,2,3,1] 输出: 2 解释: 3 是峰值元素,你的函数应该返回其索引 2。 示例 2: 输入: nums = [1,2,1,3,5,6,4] 输出: 1 或 5 解释: 你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6。 说明: 你的解法应该是 O(logN) 时间复杂度的。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-peak-element 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解答 写在前面注意这道题的条件是nums[-1] = nums[n] = -∞ ,也就是说,左右两边是最小值,那么只要数组中有个值就肯定会有峰值,毕竟如果画个图像的话,肯定会出现那个转折点,高数忘得差不多了,应该是斜线为0,一次函数中的k。 解法1:可以直接遍历,因为左右两边都是最小值,所以第一个元素就是递增,那么只要有一个减小的元素,说明就出现了峰值。 1 class Solution { 2