python 二分法模板——牢记
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | class Solution: # @param nums: The integer array # @param target: Target number to find # @return the first position of target in nums, position start from 0 def binarySearch( self , nums, target): if len (nums) = = 0 : return - 1 start, end = 0 , len (nums) - 1 # 用 start + 1 < end 而不是 start < end 的目的是为了避免死循环 # 在 first position of target 的情况下不会出现死循环 # 但是在 last position of target 的情况下会出现死循环 # 样例:nums=[1,1] target = 1 # 为了统一模板,我们就都采用 start + 1 < end,就保证不会出现死循环 while start + 1 < end: # python 没有 overflow 的问题,直接 // 2 就可以了 # java和C++ 最好写成 mid = start + (end - start) / 2 # 防止在 start = 2^31 - 1, end = 2^31 - 1 的情况下出现加法 overflow mid = (start + end) / / 2 # > , =, < 的逻辑先分开写,然后在看看 = 的情况是否能合并到其他分支里 if nums[mid] < target: # 写作 start = mid + 1 也是正确的 # 只是可以偷懒不写,因为不写也没问题,不会影响时间复杂度 # 不写的好处是,万一你不小心写成了 mid - 1 你就错了 start = mid elif nums[mid] = = target: end = mid else : # 写作 end = mid - 1 也是正确的 # 只是可以偷懒不写,因为不写也没问题,不会影响时间复杂度 # 不写的好处是,万一你不小心写成了 mid + 1 你就错了 end = mid # 因为上面的循环退出条件是 start + 1 < end # 因此这里循环结束的时候,start 和 end 的关系是相邻关系(1和2,3和4这种) # 因此需要再单独判断 start 和 end 这两个数谁是我们要的答案 # 如果是找 first position of target 就先看 start,否则就先看 end if nums[start] = = target: return start if nums[end] = = target: return end return - 1 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2018-04-13 DGA聚类 使用DBScan