二分问题

  • 基础模板
  • 开根号 lc 69
  • 寻找比目标字母大的最小字母 lc 744
  • 第一个错误的版本 lc 278
  • 寻找重复数 lc 287
  • 有序数组中的单一元素 lc 540
  • 寻找旋转排序数组中的最小值 lc 153
  • 寻找旋转排序数组中的最小值 II lc 154
  • 在排序数组中查找元素的第一个和最后一个位置 lc 34

有序数组查找一个数,或者转化为查找一个数都用这个方法。

基础模板

注意,这两个模板不是等价的,是要看问题在哪个区间是一定对的,选用哪个,并且是否有等号要再进行判断。
换言之,就是要判断哪个区间是一定正确的。

def binary_search(alist,target):left = 0right = len(alist)-1while left<right:#左边的边界mid = (left+right)//2if alist[mid]<target:left = mid+1else:right = midif alist[left]==target:return Trueelse:return Falsedef binary_search1(alist,target):left = 0right = len(alist)-1while left<right:mid = (left+right+1)//2if alist[mid]>target:right = mid-1else:left = midif alist[left]==target:return Trueelse:return Falsedef binary_search2(alist,left,right,target):if left == right:if alist[left]==target:return Trueelse:return Falsemid = (left+right)//2if alist[mid]<target:binary_search(alist,mid+1,right,target)else:binary_search(alist,left,mid,target)
  • 模板特点是在while内部return,在外部left== right。while处不需要带等号。

开根号 lc 69

class Solution:def mySqrt(self, x: int) -> int:left = 0right = x//2+1while left<right:mid = (left+right+1)//2if mid**2 > x:right = mid-1else:left = midreturn left# left = 0# right = x//2+1# while left<right:#     mid = (left+right)//2#     if mid**2 < x:#         left = mid+1#     else:#         right = mid# return right
  • 下面注释掉的方法不行,因为现在很肯定的是如果大于则往回找,但是小于了可能是对的,再缩小反而错了。类似放缩法的意思。

寻找比目标字母大的最小字母 lc 744

class Solution:def nextGreatestLetter(self, letters: List[str], target: str) -> str: #注意等号if target>=letters[-1]:return letters[0]left = 0right = len(letters)-1while left<right:mid = (left+right)//2#即使找到一样的也要大于该数所以有等号 if letters[mid]<=target:left=mid+1else:right=midreturn letters[left]

第一个错误的版本 lc 278

二分的变体,从第一个false之后都是false找到第一个位置

class Solution:def firstBadVersion(self, n):""":type n: int:rtype: int"""left =1right=nwhile left<right:mid = (left+right)//2if not isBadVersion(mid):left = mid+1else:right = midreturn left

寻找重复数 lc 287

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。

输入:nums = [1,3,4,2,2]
输出:2

class Solution:def findDuplicate(self, nums: List[int]) -> int:alist = [0 for _ in range(len(nums))]for i in nums:alist[i]+=1if alist[i]>1:return i
  • 用二分反而不自然。

有序数组中的单一元素 lc 540

给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
输入: [1,1,2,3,3,4,4,8,8]
输出: 2

class Solution:def singleNonDuplicate(self, nums: List[int]) -> int:left = 0right = len(nums)-1while left<right:mid = (left+right)//2#整个数组肯定是奇数个数字,如果正常,奇数的index和偶数index的值相等,有问题就是前面if mid%2==1:mid = mid-1if nums[mid]!=nums[mid+1]:right = midelse:#一次挪动两个,否则超时left = mid+2return nums[left]

寻找旋转排序数组中的最小值 lc 153

输入:nums = [3,4,5,1,2]
输出:1

class Solution:def findMin(self, nums: List[int]) -> int:left = 0right = len(nums)-1while left<right:mid = (left+right)//2if nums[mid]>nums[right]:left = mid+1else:right = midreturn nums[left]

寻找旋转排序数组中的最小值 II lc 154

假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。
注意数组中可能存在重复的元素。

输入: [2,2,2,0,1]
输出: 0

class Solution:def findMin(self, nums: List[int]) -> int:left = 0right = len(nums)-1while left<right:mid = (left+right)//2if nums[mid]>nums[right]:left = mid+1elif nums[mid] == nums[right]:right-=1else:right = midreturn nums[left]

在排序数组中查找元素的第一个和最后一个位置 lc 34

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:res = [-1,-1]if not nums:return res#二分先找第一个left = 0right = len(nums)-1while left<right:mid = (left+right)//2if nums[mid]<target:left = mid+1else:right=midif nums[left]!=target:return resres[0]=left#再找第二个right = len(nums)-1while left<right:mid =(left+right+1)//2if nums[mid]>target:right = mid-1else:left = midres[1]=leftreturn res

leetcode 二分相关推荐

  1. 七十六、Python | Leetcode二分查找和分治算法系列

    @Author:Runsen @Date:2020/7/4 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  2. LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置

    前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...

  3. LeetCode 二分查找

    文章目录 [0378. 有序矩阵中第K小的元素 [Medium] [Kth Smallest Element in a Sorted Matrix]](https://leetcode.com/pro ...

  4. 【LeetCode 二分查找专项】最长递增子序列(300)(to be polished...)

    文章目录 1. 题目 1.1 示例 1.2 说明 1.3 提示 1.4 进阶 2. 解法一(动态规划) 2.1 分析 2.2 解答 2.3 复杂度 3. 解法二(二分查找) 3.1 分析 3.2 解答 ...

  5. leetcode 二分查找 Search in Rotated Sorted ArrayII

    Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...

  6. LeetCode——二分查找

    二分查找 目录 二分查找法 求开方 大于给定元素的最小元素 有序数组的 Single Element 第一个错误的版本 旋转数组的最小数字 查找区间 1. 二分查找法 正常实现 public int ...

  7. leetcode二分查找

    1.猜数字进行二分查找: 2.查找两个数组之间的重复交叉项 转载于:https://www.cnblogs.com/mmziscoming/p/5777008.html

  8. 【leetcode/二分】有效的完全平方数(夹逼二分)

    问题描述: 给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False. 说明:不要使用任何内置的库函数,如  sqrt. 示例 1: 输入:16 输 ...

  9. LeetCode二分查找问题全集

    文章目录 二分查找框架 704. 二分查找 33. 搜索旋转排序数组 81. 搜索旋转排序数组 II 153. 寻找旋转排序数组中的最小值 154. 寻找旋转排序数组中的最小值 II 300. 最长上 ...

最新文章

  1. python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解
  2. iOS开发面试题整理
  3. hadoop集群的搭建(分布式安装)
  4. 新款iPhone SE并未搭载U1超宽带芯片,后续恐不支持AirTag
  5. IceE-1.3.0的移植过程及错误Time.h:36: error: expected type-specifier before ‘time-转
  6. python排序算法——快速排序时间复杂度O(nlogn)
  7. 3dmax 2022卸载方法,怎么完全彻底卸载删除清理干净3dmax 2022各种残留注册表和文件?
  8. Oracle--同义词详解
  9. (1) 创建一个Customer ,名字叫 Jane Smith, 他有一个账号为1000,余额为2000元,年利率为 1.23% 的账户。 (2) 对Jane Smith操作。 存入 100 元,再
  10. 2020-10-27 史上最全最新机器人领域期刊总结
  11. 如何修改PDF文件,PDF怎么插入图片
  12. 配置Linaro toolchain交叉编译工具
  13. java 中counter什么意思_方便适用的计数器Counter
  14. Tacotron2 NVIDIA版本优化停顿问题之Biao-Bei数据PhonePrssCrystal
  15. supermap javascript 点聚合
  16. android看黑白电子书软件,如何优雅解决App启动黑白屏
  17. YOLOV5:在本地电脑训练模型
  18. 2020.07 学习日记
  19. 公共供水管网漏损治理智能化管理系统解决方案
  20. 逛一逛大唐不夜城 2019-08-04

热门文章

  1. popen 使用方法
  2. 主驾没人!深圳允许自动驾驶汽车合法上路,图扑为车联网加速度
  3. JS高级-ES6语法汇总及案例练习
  4. drop/truncate purge
  5. poj 3208 Apocalypse Someday 数位dp+二分答案
  6. 华为海思系列芯片开发学习中常见缩写详解
  7. 你到国外去旅游,那里的人都讲英语,虽然你的英语不怎么好,但你会编程,请编写一段程序,利用文件“dict.txt”,把英文单词译成中文,帮助与人沟通。
  8. 运算放大器工作原理及选择
  9. 米拓模板:农业农产品公司网站模板推荐
  10. 突发公共卫生事件3D 可视化 | 新冠肺炎案例