首页
学习
活动
专区
圈层
工具
发布

Python递归函数,二分查找算法

我说我不告诉你,但alex比 egon 大两岁。 你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。...l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 你说,so easy!...是不是循环这个列表,一个一个的找的呀?假如我们这个列表特别长,里面好好几十万个数,那我们找一个数如果运气不好的话是不是要对比十几万次?这样效率太低了,我们得想一个新办法。...如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了? ? 这就是二分查找算法! 那么落实到代码上我们应该怎么实现呢?...=None): end = len(l)-1 if end is None else end mid_index = (end - start) // 2 + start if

97730
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    python3--递归函数,二分查找算法的实现

    # 注释 第一步执行age(4)函数,并传入一个参数4 # 第二步传参n=4,走else,此时age(4-1) + 2 # 第三步执行age(4-1)函数,n = 4-1,走else,此时age(4...l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 第一种方法 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88...,就需要把列表全部遍历一遍 第三种:二分查找(每次从中间取值,比较大小,如果要找的数字比中间值大(如果比中间值小,就取前面那一半),就直接找中间值后面的那一半,继续对半切片查找,在比较,直到找到为止)... aim, start=0, end=None):     end = len(li)-1 if end is None else end     mid_index = (end - start) /...,start=0,end=mid_index-1)         elif li[mid_index] == aim:             return mid_index         else

    1K20

    【初探数据结构】快速排序的四种实现方式(Hoare,挖坑,前后指针,非递归)

    一、Hoare法(左右指针法) 实现步骤: 选基准:选最左边的元素作为基点 双指针移动: 右指针先向左找比基准小的元素。 左指针向右找比基准大的元素。...发现问题 问题1 当基点每轮都是最大或者最小的元素时,性能会大幅下降,时间复杂度来到了 O(N^2) 也就是说,会递归N次。...填坑: 右指针向左找比基准小的元素,填入左坑,形成新坑。 左指针向右找比基准大的元素,填入右坑,形成新坑。 基准归位:当左右指针相遇时,将基准值填入最后的坑中。 递归分区。...if (begin end) { int keyi = PartSort3(a, begin, end); // 压入右子区间...STPush(&st, begin); } } STDestroy(&st); } 注意事项: 栈操作顺序:需确保先处理左子区间,再处理右子区间,压栈顺序应为右子右界

    54410

    排序算法

    0) { if (a[end] > tmp) { a[end + gap] = a[end]; end -= gap; } else...要小——左边第一个做key R先走 //1.R停下来 L遇到R 二者相遇 相遇位置比key小 //2.L停下来 R遇到L 二者相遇 相遇位置比key小 //发生第二种情况一定是R没有找到小的和L相遇,但此时...L的位置已经被换成比key小的数据 //同样的道理:如果右边第一个做key——L先走 //单趟排序的价值 //1.key已经找到了它的最终位置,这个数已经排好了 //2.分割出去了两个子区间,如果子区间有序...),则以第一个关键字65为基准而得到的一趟快 速排序结果是() A 34,56,25,65,86,99,72,66 B 25,34,56,65,99,86,72,66 C 34,56,25,65,66,...99,86,72 D 34,56,25,65,99,86,72,66 答案: 1.A 2.C 3.D 4.B 5.D 6.A 7.A

    62650

    一网打尽!二分查找解题模版与题型全面解析

    + 1; } else { end = mid - 1; } } 根据条件返回 end 或者 start 这里解释下,针对这个问题,要找的元素可能会有很多个,我们需要找最后出现的那个...题目分析 其实题目就是要找最先出现的元素,在这种情况下,如果我们找到了元素,依旧不知道它是不是最先(小)的,但是我们知道答案肯定不在后面,肯定在这或者是之前,因此这种情况需要将尾指针往前移。...,或者是在前区间但比要找的元素大,这时我们需要移动尾指针 t m m m [...][...] -> 要找的元素和二分中点都在前区间,但是要找的元素比二分中点要大,这时移动首指针 m t [......][...] -> 要找的元素在后区间,二分中点在前区间,或者是在后区间但比要找的元素小,这时我们需要移动首指针 m m m t [...][...] -> 要找的元素和二分中点都在后区间,但是要找的元素比二分中点要小...很难理解的原因是,我们可能会认为二分最后得到的答案有可能不在乘法矩阵中,但这个疑点其实是可以利用二分的性质来解释的,二分就是不断趋近于最后的答案的过程,而且这里我们是二分整数,你可以把这道题想象成找元素在数组中最先出现的位置

    1.1K20

    【验证码逆向专栏】V5验证码逆向分析

    我们的首要目的就是找到onopen,既然它实例化了,那么 onopen 大概率就是在附近,果不其然在下面我们找到了这个方法。...发现它又调用了 t 函数再次进入 t 函数,发现有参数构造且传参过程,如下:我们进入该函数中,看看是不是我们最终要找的消息加密的部分,进入后发现这个函数就是我们要找的消息加密主体,通过 n = Cb(i...了解WS的知道,返回值的处理一般都在 onmessage 中,所以我们找 onmessage 事件处理器。...)), remaining_distance) current_x += step remaining_distance -= step​ # 时间增量(随机但逐渐增加...)​ track_str = ",".join(track)​ return track_str​​# x_distance = 72 # 你想要移动的距离# track_str = generate_slider_track

    57110

    全排列生成算法:next_permutation

    观察pn可以发现,其子序列已经为减序,那么这个子序列不可能通过交换元素位置得出更大的序列了,因此必须移动最高位3(即a1)的位置,且要在子序列中找一个数来取代3的位置。...子序列中6和4都比3大,但6大于4。如果用6去替换3得到的序列一定会大于4替换3得到的序列,因此只能选4。将4和3的位置对调后形成排列。...而4是第1次作为首位的,需要右边的子序列最小,因此4右边的子序列应为,这样就得到了正确的一个序列pn+1=。 下面归纳分析该过程。...=72; 后3位的全排列为3!,7为{1, 4, 5, 7}中第3个元素,故3*3!=18; 后2位的全排列为2!,5为{1, 4, 5}中第2个元素,故2*2!...=4; 最后2位为增序,因此计数0,求和得:1440+120+72+18+4=1654 C++/STL实现 #include #include #include

    1.4K60

    《算法竞赛进阶指南》0x16 Trie

    ,AC 自动机会在以后章节详细讲解 维护异或极值 边插边询问即可 维护异或和 插入 & 删除 板子基本功能 全局加一 从低位到高位开始找第一个出现的 0,把它变成 1,然后这个位置后面的 1 都变成...ch] == 0) p = trie[p][ch]; else { res += 1 << i; p = trie[p][...数据范围 1≤n≤100000,\ 0≤u,v<n,\ 0≤w<2^{31} 输入样例: 4 0 1 3 1 2 4 1 3 6 输出样例: 7 样例解释 样例中最长异或值路径应为 0->1->2,...值为 7 = 3⊕4 解析 本题解法非常的秒,用到了异或的性质: x ⊕ x = 0 因此,求树上任意两点的异或路径长度 等价于 求他们各自到根节点的异或路径长度的异或值 证明如下,分类讨论即可: 第一种情况...ch]) p = trie[p][ch]; else { res += 1 << i; p

    40620
    领券