00:00
归律就完了,递归说白了就自己都要注意,当你发现一个呃,怎么讲呢,两个事物关联性很强,特别像的东西的时候啊,可以用这个递归,其实人类的繁衍就是个递归,对人类的繁衍就是个递归,人从一到20岁,20岁生孩子,孩子跟你的跟你的过程一样,也是从零岁又到20岁一样一样的啊对,仔仔细细规用记好了往下啊,哎,第二个难点好,第二个难点二分找二分找你,你讨厌这个是吧,我也讨厌这个来看好啊。醒醒清醒二分查找这个题值两分钱是吧?二分二分两分两分来看二分查找每一次听好,它是排除掉一半的数据,排除掉一半的数据听为什么排除一半呢?首先它的要求比较的恶心,他要求这个序列就你的这个数据必须是个有序序列,有序比方说给你1亿个数啊,给你1亿个数,1亿个数里面如果你想判断啊66在不在这1亿个数里面去,那么我们要怎么玩呢?得从头开始遍利对不对,遍历一遍,然后看看有没有,那这时候你的时间复杂度是多少呢?是从头到尾就是1亿次,你要判断1亿次才能知道对不对,那么这时候如果用二分叉找看着啊,一个数正常啊,正常一个数,那么我掐头结尾取中间让。
01:36
你要比比对的那个数啊,跟中间这个数去比较,如果你那个数比中间这个数大,那么它一定会出现在中间这个数的右边,对不对?现在排序了能跟上吗?能跟上吗?它整个是个有序列表,我跟中间比,你比中间的大,那你肯定在右边,左边是不是可以得要了,对不对?一个数一砍剩多少了5000万对不对?同样道理,再来一次,再来一次也是插头结尾取中间,这时候再一砍一刀,500又剩多少2500万对不对?一次性就砍到一半,一次性砍到这,那么这样一砍,听好了,这样一砍你最多最多就1亿个数里面你最多,你想你除二除二除二除二除到什么情况能除到零呢?除到一呢?除到最后,除到最后多少次?一次除一半,一次出一半,怎么算,是不是二的N次方等于多少一了,对不对,2N次方等于一,那我们算呗,大概二的多少次方。
02:36
等于一算呗,来算器高科技高科技看这不是log log不太好算,因为很多人不太理解,来看看啊二的多少呢?我们先来二的20次方看看多少,这是100多万对不对啊,20次方来乘以二,这是11次多少?21次方,21次方,那这是200万,来再乘以个二,这是22次方,再乘以个二二三次方,哎,我直接凑吧,这这太过契了是吧?来二的看着啊30次方走,你这多少个十百千万十万,百万,千万亿十亿了,对不对,那也就是说在这是多少次,这啊30次对不对,也就说在30次以内,我一定能找到你那个数,能听懂啥意思吧,30次以内我定能找到你数,因为每次砍一半,对吧,每次砍一半,那么听好了,你原来从头走。
03:36
你要比对多少次,1亿次,现在二分查找多少次,30次,哪个快哪个快,对不对,肯定30次一快对吧,所以二分查找,查找的效率会非常的高,查找的效率会非常的高,但是不是最快的。啊,还有更牛逼的啊,还有更牛逼的最快的是啥呢?字典是不是字典啊,字典字典太太浪费空间了啊,太浪空间了,不是冒泡,是排序兄弟逗了啊,看着最快的是谁呢?是咱列表的那下标,列表的那下标,比方说我找第十个元素,直接列表下标分分两个十和第十个元素直接拿出来一次,明白这意思吧,一次你知道有序,我说我说的是查找的这速度,这个效率,你甭管它是找什么找什么,对,甭管找什么我就查找效率这是最高的,这是最高的啊嗯,好了啊,这就说到这,然后二分管查找,听好,查找效率非常高,所以笔试题里面很多的公司会要求你手写一个二维码啊,手写一个二维码,所以二对,所以你要想想啊,不是两不是二份不二。
04:53
这题真的能用好了这个东西的人,他可不止是二分,你知道吧,2000多不止啊来,但是按分厂长要求听啊,必须是有序序列,他要不是有序序列,那就完蛋了,那们没法没法弄了,你知道吧,他都写为起中间对不对,结果你没序,没序的话,他在前面呢,对不对,那他们在前面,小数在后面,所以就不成啊,必须有序,怎么呢,只含数字啊。
05:20
不一定查数字啊,那你这个汉字什么的没大小啊。讲道理是这样的啊,讲道理,但是咱们讲了solid可以搞的啊,可以搞的啊,来给我啊,对吧,还是啊,我就讲这个数字的啊,你你那个那个那个算课那个你可以写完之后发给我,我给你参考参考是吧,第二这个怎么找,首先我要给你一个有序序列,然后呢,你去查找,掐头结尾取中间,首先我会告诉你们三种方案去搞这二维码啊,三种方案,第一种方案不用递归,不用递归,纯算法啊,纯算法看着啊纯算法了,来我们来弄一个这个玩意儿。
06:03
这是你未来跟人吹逼的资本,二三法吹逼是吧?二三法查找差点写吹逼是吧?来,首先给我来个列表,来个列表等于方括号,比方说随便写1122334444啊5566778899,够了啊够了,那么接下来我想去查找的话,我说的二分码特点,掐头结尾取中间你必须得有一个东西来记录一下头跟尾在哪,那么看好了,头我们叫它left等于零,第零个元素,头第零的元素对不对?结尾的话是哪个结尾负一没有音啊,没有一观到的负一啊,他说的没错,他说那个那个是不是不是,我们说最后一个因是多吧,认减一减一对吧,最后一个元素别说负一啊,没负一的事啊,看到最后。
07:03
Right等于啥呢?等于是list怎么办?减一是吧,一左右啊一左右,然后中间是哪二分之它的加起来中间是哪?是不是左面加右面除以二出来数中间了对不对?所以看好了middle middle等于啥呢?是left加上right,看好了加一起加一,然后呢,再除以二啊除以二就会出问题,为啥呢?前面是零,后面是九多少呢?九加零和九九除以二等几4.5对不对?但是我们要点吗?我们这个准备要的是不是第几个数啊对不对?所以要怎么除,要地板柱啊,要地板数好了地板数之后头尾中间都有了,接下来我是不是就开始判断了对不对?好了,来看着看着我们在这准备一个目标N啊,假如说我想判断66,咱们在这里边。
08:03
啊,判断66在这里面,那么现在目标也有了,去判断想想啊,我要判断的话,你能说确定我到底要几次能把这个数判断完吗?不确定它不停的判断对不对,一不停就要干嘛了,循环好了,V循环对不对,V要循环,那么V集成什么情况下让他出来,不让他接着循环了,在里边就找着了时方大家看好我的工作什么一左极右,然后呢,取中间跟中间做比较,如果中间比那数大的话怎么办呢?是不是把左边给我拉到中间,然后再做到一边中间,然后右边的小的话怎么办呢?再挪这面来,然后这样反复的这么挪,也就是说左边跟右边不停的向中间在靠拢,慢慢的去缩小它的范围,是这样的吧,那么最终出来的结果什么样呢?当你的右边比左边大了,走到这样的效果了,是不是就应该出来了,是不是就应该出来了,一会你不停的减嘛,对不对,不停的减减减减减减到这边的时候,哎,再减没了,不是变成这样了。
09:03
那肯定你这列表里面没那个数,能明懂啥意思吧,比如当你这么走走走走走走到中间的时候,哎,走到这上合着再往下走,这时候肯定都整个数据列表都找过了,还没存在,那肯定不在这列表里面,所以它的循环条件就是当left小于什么呢?小于等于right的时候,让你的么这哈往下走啊,正么正常走,当你出来的时候,看好了,从这出来,一旦走到else的话,我们可以认为什么呢?你不存在啊,不存在该数,不存在该数好了,这块大框搭完了,搭完了之后往下再走来,左边跟右边条件准备完了,准备完了之后该让你的这个数跟谁比比,说中间那个数,那中间那个数怎么拿怎么拿,应该是list里面哪个数,Middle是不是list没是中间那个数,让中间那数哎,跟你的目标那数做比较,如果。
10:03
你的目标数比中间的数大什么意思?什么意思?数不是在右边,是不是在右边?如比它小,数是在左边对不对?所以我们就可以来给它进行一个划分,看着啊,如果你的目标数N大于了你的中间数,也就是说它出现在右边来,兄弟们,它出现在右边的话,我是不是应该让左边这个分过来值是的,中间值等于中间值就行了啊,等于中间值行了吗?它比中间这个值大,那肯定是不等于中间值对不对?那肯定是,怎么是中间值往右移一个是不是移一个?所以我这块干嘛呢?让左边等于谁呢?怎么办?甲等一,这能干什么?细想想,对,仔细想想来,看着这是这么大个列表啊,这么大列表,然后呢,这是中间,我那个数比你中间这个数大,肯定是中间这个数往右移个在后面出现,是不是在后面出现,所以我把左边那个边界挪到这个位置来,然后下次算的时候是不是从这块。
11:08
开始算中线的是这样算中间的对不对?所以我让左边东西往这边移啊往这边移来往下l if,如果你的N小于了list里面的没,这是什么效果,这什么效果?是不是你的目边数比中间那个数怎了数就小了,是不在左边出现,它在左边出现的话,是不是要右边距往左靠拢对不对?往左靠拢往左靠拢靠拢往哪是不是中间那个数往左再移个对不对?所以怎么写right来RI等于谁等于middle怎么办?减个一是不是减个一对不对?来还有第三种情况就是恰好你中间这数跟谁相等,什么意思?就是它对不对?来什么在存在来可以存在,那么在哪呢?可以去打印一下在middle位置,在这个位置中间那个。
12:09
正好走中间是来list,不就是那数吗?那数不就N吗?但是我现在想找的是它在哪儿,它在哪儿,他在哪儿,是不是中间这个位置对吧?我说在哪的位置位置,然后找到了之后还往下走吗?找着找到还走啥呀?干嘛了?出去对不对?出去好了,整个这算法整完了完了完了完了为啥完了呢?仔细看啊仔细看来当我看啊,我现在找66,我们往里面带一带啊,带一带66是你的N,那么现在掐头结尾取中间,掐头结尾取中间应该是它吧,是它吗?一共是九个数,九个数除以二应该等于四对吧?100除吗?等于四,那中间是它,中间是它的话,往下一比较来判断一下你的NN是几?66 66跟中间的44比谁的?
13:09
也就是它出现在哪,出现哪,是不是这些里面,现在里面,然后现在看好了,我的在哪呢?我的在哪呢?看好了,我现在left是不是指向它了,Right是不是它呀,对不对,然后这时候掐头结尾相加在取中间是谁了,是不是它没它来77再一比较的话是什么意思,这不再循环了,再循环的话来对不再循环,等55和六十六十来,这时候再出现的话,应该是在左边的话,在左边的话是不是这个指针往左移,是不是挪这边来了,对不对,然后呢,再掐到结尾取中间,最终看好了,最终这个66就会被拽到,然后呢,让左边再指向它,最终最终效果是它俩都指向它,最终的middle是这个66 middle是66间对中间好了,现在我跑一下,它会出一个问题。
14:05
找你变是个什么效果,是个什么效果,死为什么死来我在变在变,但是谁没变,Middle没变,Middle在这合适吗?在这合适吗?上来零,然后然后取个middle,你下一次循环的时候,左右是不是改了,改了中间是也跟着改了对不对,所以我要把门子放哪去放里面去来走你进来对啊进来来这会再看找你团长存在在第五个位置来对一下012345O不OKOOKOK啊OK,但是一共比较几次,几次呢?三次几次现在不知道是吧?来来一个count等于一记个数可以吧,每次循环给我打印一下比几次对不对,来在这的话给我不是在最后出来的结果之后啊,我们去打印一下多少次,打印个count,但是每一次查找的时候都要干嘛呢?
15:05
等于加一啊,这个应该都OK了,来走,你一共找了三次就已你找到了啊,找了三次就可你找到了,至少它比你后循环从左到右来一遍要快,要快好了,数据量就越高,对数据量越大,它的体现的效果价值就越高,那123234345456567678789,然后再来个1111,来随便说个数多少,789789了,这写错了,来789好吧,用不了几次就出来了,看看几次,四次,四次来换个数,比方说567啊567,这应该三次有可能啊,也是四次啊,也是四次,一般咱们在测试的时候,很少能出现五次以上的这种效果,很少啊,很少,因为五次的话相当于二到五次方了,二到五次方了啊,基本上很少用到那么多的次数。
16:05
好了好了,这个就是我们所谓的二分法查找的一个算法,它的核心思想就是我们的头尾啊中间,让中间这个数跟你的目标数比较,如果中间的数对吧,你的目标数比你中间数大,那么一定中间的右边,那就让左边界往中间移,往中间移,移完之后再去向右结尾,再去中间,再去比较,每次砍掉这个列表的一半,每次砍掉列表的一半啊,这个效率是非常的高啊,非常高,OK,这个是第一种写法,这个是第一种写法,恰头结尾行键好了从算把这个回去,把它整理到你的博客里,整理到你的博客里面去啊,然后接下来我们来看一下递归怎么来做这个事啊,地归神要理解的东西了,神要理解东西了,来上厕所,听完的呗,兄弟忍不住了。
17:05
那你就去,你去啊,Hold不住了就去啊,看着啊,这是我们的第一种方案,那么接下来第二种方案就是递归,递归的话,我给你们讲两种,递归讲两种,先看第一种啊,先看第一种,第一种怎么玩呢?首先老样子,先把这玩意儿拿过来,拿过来,然后既然看好了,我这既然插头结尾曲中间,想想我刚才在做这个循环的候来,我在做这个循环的时候,谁是不停的在变的,并有规律的在变收尾和间。中间是不是可能首尾球可以算法,所以再变的是手过来,尾过来对不对,然后再扔去,是不是继续手再过来,尾再过来,是不是这样的,要反复的慢慢的再往里边去缩小范围,所以它的怎么讲呢?它的改变的这个递归的条件就啥呢?就是这首和尾来叫做参数啊,传几个参数两个,一个是left,一个是right,对不对?来两个参数来有个头有个尾之后我要算啥,中间要算啥,算中间对不对,中间怎么算,等于谁小号里面left加上right加个嘛,除以二对不对,除以二,那现在中间是不是有了,对不对,来中间也有了,来左右也有了,那么接下来是不是开始判断了,那你要有一个什么啊,目标N看好了啊,你还要传一个目标N啊,忘了目标N,那么。
18:46
坐标N的话,接下来判断,如果目标N大于你的列表中的没大于你的中间项什么意思出现在哪?左边右边看不到了是什么什么看不到了屏幕来我重切一下有吗?
19:08
有了行了来,为了防止你们看不到是吧?这样啊,来锁死啊锁死,来看这看啥?如果你的N大于了,你什么目标,就中间那个数N大于中间数,那什么意思,肯定在哪边在哪个数在右边对不对?好了,在右边的话,我要怎么玩,我要怎么玩左,我把左边这时往这边移,移到哪去?Left等于谁等于怎么办?加个一对不对,往左再移一个对不对,再移一个好了,然后呢,如果看到l if,如果你的N怎么办呢?小于list里面的middle对吧?小于这middle什么意思?是right往左移对不对?然后right等于谁等于什么middle怎么办?减个一对吧,往左移,在左面出现了,然后else看着啊,这else什么意思,是不是找到了,找到了之后谁什么。
20:08
怎么是不是没啊,对不对,我最后要的是是没好了再往下,再往下来,程序如果能走到这是不是没找到,看我这程曦走到这是不是没找到,找到的话说就出去了,对不对,所以如果没找到的话,应该怎么玩呢?怎么玩呢?是不是继续在left right是不是这样,然后左右你左左右看左一开始是这样这样,然后我截到一半之后,假如左边挪这边的再往下是不是左右再再来一遍,然后再切切到中间去,是不是啊,就这样的效果,所以左右是你的整个循环的这么一个中点,那么你们还要再把人呢,把这N给它带着,N是干嘛的,你要有目标数对不对,好了好了,那接下来看好啊,这块有一个深高,有一个深高,我算法写完了,程序写完了,测试的时候print打印一下,Left是零,Right是多少啊?List解一。
21:08
还是那些纸知道吧,东西还是那东西,那我现在想找个数来,你们说找谁99拿住99对吧,好了,走,你有问题吗?有问题有问题有问题大问题,来这逗号写字来找你跑起来。仔细看啊,等于几八,第八个位置太中间了,来换一个66走,你我要的看是这个,我要是这个,我要是这个看好了,无论怎么想,兄弟们,这个题无论你怎么想听好啊,这个程序我告诉你它是没问题的,这个程序是没问题的,无论你怎么想,你都想不到对吧?为什么会来个,那想想什么情况下,我调用一个函数会给我返回个nu写返位值对不对?那我想想我第一次bary掉进去的时候看啊,我掉进去的时候注意看掉进去时候,那么掉进去时候会访问到这里面,访问到这里面,那么第一次我找的是66 66恰好还不在中间,对不对,不在中间,在在里面,那也就是说它需要进行一次递归对不对,是不是一个递归,那么看好了啊,这个需要你要理解。看长我。
22:30
第一次寄来的时候,我第一次啊执行这,那么寄来的时候,这块一访问,把这些东西一执行,然后这一块再一执行,这是第几次掉了,是不是第二次掉了对不对?看到第二次掉的时候,假设第二次我真的给你找着了,找着了第二次返回,返回的是那个位置,假如那个位置是五,假如是五,那么也就是说意味着你第二次调用这个位置是几呢?是返回的五对不对,是你第二次调的嘛,第二次调第二次得到的结果,那第二次得到那个值是五,那么想想这块扔一个五,是不是没有任何东西来接的,是不是没有任何东西来接的,没有任何东西来接的,那么这次调用是不是就结束了,写没写特有没有,特有没有没有,那个特是第几次掉的,是第二次掉的,对不对,第二次真的返回来了,一一个值,但是你第一次掉的时候有没有写瑞特,没有执行到瑞特,所以这块认为什么呢?你第一次掉的时候怎么办呢?没有。
23:30
返回任何东西,直接得到了什么呢?得到一个nu,得到一个nu,那么再说一遍啊,为什么是nu,这一定要理清楚,每次调用咱们说返回值返回到哪呢?谁调的返回给谁,记住了谁调的返给谁,那么看好了,我这次调binary search,调的是哪?是不是这一块对不对,第一次掉,第一次掉下来一直行,一直行,一直行,一直行,然后到这bary search,因为66第一次找不到,第一次找不到,第一次找不到的话,那它就涉及到第二次调用对不对,第二次用,那么好了,看好了,第一次调用到这块就结束了,从这会开始进入第二次调用,那么第二次调用假设他真的找到了,他把那个值返给你了,返的位置是哪儿,是不是还是这个位置,因为你是在这儿调的,能听懂了吧,在这调的,你在这第二次调的返回的肯定是在这儿返回,在这的话,这儿不是写一个五程序就过去了,有返回吗?没有返回也就是第一次调你没有拿到。
24:30
返回值,那怎么能拿到呢?我是不是把把下一次要的结果返回给上一次是不是就可以了,对不对,所以很简单,想改的话,在这加个啥顿,在这儿加一个盾,要不然你这块接不到值,要不然你接不到值爽不爽那个。莱瑞来走哪个第走哪个,你看你第一次看他第一次掉的时候进来,进来的时候如果你不写这个下面特看着,如果你不写下面这瑞特看着第一次我这么画吧,我不这么画了,来看着我这么画,这是第一次调用你进来啊进来然后呢,你去访问一个函数,这个函数呢,从上往下走,走到最后一行,是不是又掉一次,它自己是这样的吧,最后又掉一次,自己来这块又掉他自己相当于你又去访问一个函数,哪怕是它自己是不是也是这样的,是不也是这样去执行的,那么这时候执行,假设第二次从上往下走,执行的时候找到了结果,找到了结果是不是返回,返回哪儿,是不是返回到这儿,是是返回到这,有没有返回到这儿,没有,没有,他不可能返回到这儿,为什么不可能?
25:48
那不可能,你是不是说了,你返回来是谁掉的给谁,记得吧,谁掉的给谁,我是在这儿掉的,那么你执行完了,你肯定把那值返哪的是反这了,对不对,反正了之后,那你这个函数相当于执行完了,它根本就没有往回反值,明白啥意思吧,根本没有返回反值,所以这块你必须听好啊,必须加一个return,要不然你拿到的就是空啊,然后就是空,那么什么情况下,什么情况下不写它可以呢?
26:19
恰好第一次指向了,知道吧,就刚才那99恰好第一次就给我指出来了啊,那种情况没得办法,好了,来看一下现在的结果。五是不是五一零一二三四五六十六是他是他这个是用地归啊这么巧。不巧吧,99 99比较,99比较巧,它在中间知道吧,它在中间,它比较巧,好了好了,这个是用递归来完成二分法,听好了第一种递归啊,这是第一种递,接下来看第二种递归,好了,这个题我们现在的想法是什么呢?改变的是啥呢?是left和right往中间走对不对?改变也就是说你原来的列表我就没有动了,没有对吧?你原来是这样排的还是这样排,只不过我现在找直怎么的,从这开始找,找到结尾中间,中间找到找中间,那么下次找的时候是从中间到这个位置再去找,对不对,你原来的列表我是没动过的,我是没动过的,那么想想接下来我可以干嘛呢?我现都是切,我是不是可以把整个列表是正常列表对不对?我找一下它切一半把这些流量,我把这些流量不是从这里面再找对不对,再找的话,是不是还可以扒把中间再切一刀,对不对,再切一半。
27:42
所以第二个可以动的是啥呢?就是这个列表啊,把这列表我切啊切列表来看这首尾就会不样了。对,首尾就跟着变了啊来变一直都是对,对首尾呢在函数里面是不变的,来看第三种写法B叫过分,这种不过分这种过程到什么程度呢?你只能判断出说他在不在你,你没法达到它到底在位置在哪儿,因为你把什么呢,把整个列表切了对吧?去切了看这判断,我现在告诉你,我现在要把列表切断,切断的话意味着我每次传进来是一个新列表,懂吧,传过来新列表,所以我这结什么呢?切列表啊,接列表,然后还可以结合啥呢?结合你的目标数据N啊,目标数据N,那么接下来我就可以接着堂堂正正的去写我那二维码了啊首先可有一个左,左的话,现在每次传进来都是个系列表,那我左永远是哪零对不对?右呢,右呢,永远是列减一对不对,那他们根据谁来变呢?根据。
28:50
你的累子在变,一开始仍长累子对不对,那它的右肯定是比较长的,那通过它的截取变成了这么长,那你的右是不是得跟着在变的对不对,然后接下来左右有了,一定要有谁啊没动是吧,跑不了的是left诶加right,然后干嘛,地板除二对不对?中间好了,接下来让我干嘛,是不是跟刚才一样了,如果怎么办?大于了什么,List中的谁没懂这是什么效果。
29:24
如果说右边右前往右来来看着啊,也就是说如果你的N大于了你的这个的话,它出现在右边,出现在右边的话,看好我要把整个列表重新进行一个切片,怎么切呢?从中间往右一个格子切到哪最后对不对?所以我就可以让list等于谁呢?等于list怎么切list方括号从哪middle加一到哪负什么一到最后对不对,到最后搞定了啊然后呢,否则如果如你的什么呢A怎么办呢?小于list中的middle,那这时候怎么办到list等于list中的。
30:25
谁冒号,冒号减一对不对,然后切从头切到耳,切到这个往前一点,往前一个位置对吧,然后list跟着变了往下,如果它俩正好相等就走这else的话,是不是也是找到了对不对,我可以直接打印一下什么找到了是吧,存在,然后写个return,仅此而已啊,写个return仅此已,具体它是多少数不知道啊,或者因为你的列表被切了,懂吧,列表被切了好了,再往下走,再往下走,如果程序能走到这儿,是不是这俩都没走成不,这个没走着没走成,走这的话什么意思,是不是再来一遍find research应该写什么?新列写什么,是不是这新列表和那个数据N的对不对,因为列表被换了,知吧,被换了,被切短了,切了一半出去,然后还要加什么,不用,这不用。
31:25
那这不来找到,再往下来,现在我是只能找到了,什么情况下是没找到。如果左边什么情况下是没找到左边的右边都大了,当右边等于零的时候,当右边小于右边小于零的时候就是没找到,看,如果难右边小于零,所以左边是零吧,啊,回去自个琢磨琢磨啊,左边永远是零,因为你切切短切到这,假如这段切出来这边变成零对不对,对吧,永远切切成什么?当它等于零的时候,它俩当right等于应该是小于等于零是吧?小于等于零或者小于等于left的时候是没找到,来看一下,我们来测一下啊,Print by,哎,不是print,直接就是inary search来找一下谁呢?呃,List list,然后找个数66走你,66找到了是吧?来换一个65走你。
32:34
报错了,这是边界性问题,对不对?没找到,他告诉你没找到了,我的天,这找啥腿特没找到,你还往上找啥呀?停走,你看长没找到,没找到,三个人来这个出口找到了,这个出口是不是还没给呢?失误没看着这个出口是不是还没找呢?来这个出口怎么给呢?
33:00
就是你找不到的情况下,现在66是有的对不对,65是没有的吧,对不对,来走你65没有的吧,是报错了,是报错了,什么原因报错了,妹夫的和那个外上交叉的是来这个这个作业,作业自己想折啊,自己想折,这个听好也是边界性问题,边界性问题主体都给你搞定了,主体都给你搞定了,就差个什么呢?哎,当你找不到的时候,什么时候能出来,什么时候能出来想想啊,这个是没改变列表,所以它是左右对右动对不对,左右对动就是说它往这边移,它往这边移,它往这边移,他往这边移是这样的对不对,什么情况下是让它出来呢?是不是这样了,是这样了,这个条件应该跟谁一样,是不是跟上面那个是一样的,对不对,所以碰断下,当左边跟右边什么什么关系,应该蹦出来,应该告诉它不属于啊这个自己啊,想折想折给它加下来,并且听好啊很。
34:00
很多人会想我边界判断了,比方说边界判断AAB大于B了,随便写了,这时候很多人会写,写个print啊,然后呢,Return就写完了,很多人会写这样的东西,知道吧,但是这样很不规范,很不规范,最规范啥呢?Return负一。返回一对,为什么返回到负一会比较规范,像列列表里面有没有负一那项,没有,那返回负一什么意思呢?没有懂啥意思吧?没有,那为什么非得要写个负一呢?为什么写这句不好呢?国为什么不好呢?外国人看不国人看不懂有道理,第一你这打印屁用没有,这个打印打印屁用没有,因为你这是个功能,你这是功能,二分查找,二分查找的话,想想你要找到了返回个数字,找不到好家伙,你给它返回,那那是数字吗?不是数字,所以最好返回的都是数字,告诉他我要返回给你一个数字是那个东西,如果返回的是负一,那这时候是没有的,明白啥意思吧,这样是比较规范的写对。
35:09
对啊,比较规范的写法啊,开始尝试着去琢磨这样的东西啊,来这边界边界有没有思路,我直接给他写完了,有没有思,应该写什么,左左边怎么大小,右边是吧,最后转负一来我们试一下啊,给65来走,你返回负一,没找没找到啊,下面这个是吧,吓面这个吓我一跳啊,OK,这个边界是对的,就是当左右,你左右不是在动吗?对吧,在动吗?你这面往这边放,再往这放,当出现这种情况,那一定要出来,你不能再因为再往走,无穷无尽一正往下走,对吧,累死你啊,累死你跟犯啊,对对对对对,跟那个贩子差不多啊,这样是比较合规范的。好了,这就是咱今天的二分法查找啊,这种不用递归的,你要会写,要整理出来啊,用递归的这种要给它。
36:09
整理出来就是咱们刚才讲的第一种办法,第二种这个啊另类的,这个你就有兴趣看一眼就了,就切切片,那个有兴趣看一下行了,非主流太非主流,因为没什么卵用,为啥呢?你只能告诉我在或不在找不对吧,我找不到它在哪知道吧,这个不太好,不太好就找不到,所以然后也就走了,太难太难了,不成啊不成,来好了,这些东西说完了,看一下今天讲了哪些东西,开始回来填这东西啊,来来来来来,它的语法什么的,后面是变量值吗?参数参数冒号返回值对不对,返回值好了,这是匿名函数啊,匿名函数它的写法会比较简单,但是注意它不能完成的复杂的操作啊。
37:09
你要想写复杂的,乖乖的去写函数,不要用它啊,然后再往下sorted什么意思啊,排排序啊排序,排序的话三个参数,第一个参数是啥来着?数第一个参数啥来着,可迭代对象,第二个是啥排序是什么函数对吧?给一个函数,这是什么排序规则对不对?第三个是啥来着,Reverse等于什么什么意思,是否倒叙啊,是否倒叙OK来往下filter filter是干嘛的?过滤过滤对吧?过滤掉不用的数据,那么它的这个这个这个这个写法第一个是什么?第一个是函数对吧?第二个是啥可迭代对象,它的执行过程是把可在对象里边的每一个元素交给这函数进行过滤,函数必须返回什么?返回true或false啊。
38:09
得处的那就给你留下,得false的就给你干掉,然后map,它是映射,映射的话,它的写法里面是两个参数,第一个参数啥也是函数,第二个呢,可迭代对象啊,可迭代对象,它可以把可迭代对象里边每一个元素拿出来交给这函数进行处理啊,函数没有特殊要求,然后递归啊,递归说白了就是自己调用自己递归,听好了,用好了是神,用不好了连虫都不是知道吧,用好了它就是神,用不好连人都不就是它这个用法呀,就是能够get到那个点是很难的,但是它的语法呢,又特别简单特别简,它的语法不简单吗?它的语法还能更简单吗?来写个方是不是,这就是递归了对不对?来在外面得下,这就是不是递归了对不对,不是你说的话。
39:09
怎么不信,我说的话就是这样吗?这不叫递归吗?给你一道递归,对啊,递归的难点就是什么呢?寻找看啊,难点就是不好想啊,不好想啊需要找规律听好啊,需要找规律听好,通过咱刚才说的这个二分法,二分法这里面听好啊,我们尝试着用不同的角度尝试写递归,首先我们可以考虑它的变量是左右,左右来回这么动对不对,其他的不动,那么还有一种思想什么呢?我让列表去动,然后左右右不动,知道吧,左右又不动,所以这个看你怎么去想,看你怎么想,这个特别难想啊,但是地归还有一个坑就是不好读,地归的代码一般都不太好读啊,这个比较的难理解啊,比较难,但是有些情况。
40:09
能给你解决非常大的难题,比方说就咱这个便利文件夹,你可以考虑一下,如果不用递归,你要写几层循环,那是不是就不一定了,所以不一定了,你这说白了,这是一层对不对,这叫一个循环,这是不是要一个循环里面还有文件夹是不是还要再循环对不对,你的循环层数是定不下来的,所以这时候用递归不是只能递归循环能做啊,循环能做数的便利里面有啊有好了,这是它的难点啊,难点不太好理解,然后那二分法,二分法,二分法的特点就什么呢?掐头掐头结尾对吧?取中间取走取中间啊,然后呢,不停的改变什么呢?左和右啊左和右,然后呢,间接的改变中间,间接的接间接间接啊变中间,然后这时候。
41:09
好,它的查询效率非常高,查询效率非常高啊,好了,这就是二乘法,然后回去啊,把这个算法整理它整理一下,好好整理一下,把它放在哪,兄弟们把它放在不是肯定放博客里面是吧?放在咱之前不讲一个冒泡吗?把它跟冒泡放一起,为啥呢?冒泡是干嘛的?排排序的,二三法的先决条件是什么?排有序对不对,这俩玩意是一套,懂吧,这是一套啊,像煎饼果子一样啊,一套一套的,好了,这就是今天的内容啊,然后呢,随着这一坨东西的完事是吧,咱们整个前面的基本上就到这啊到这了,比如说下周一啊,同学们停了。
我来说两句