leetcode 二分
二分问题
- 基础模板
- 开根号 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 二分相关推荐
- 七十六、Python | Leetcode二分查找和分治算法系列
@Author:Runsen @Date:2020/7/4 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...
- LeetCode (二分小专题)33搜索旋转排序数组34在排序数组中查找元素的第一个和最后一个位置35搜索插入位置
前言 国庆前最后一次打卡,国庆后继续开启,公众号bigsai回复进群欢迎加入打卡,如有帮助记得点赞收藏. 近期打卡记录: LeetCode 32最长有效括号(困难) (本周) LeetCode 30串 ...
- LeetCode 二分查找
文章目录 [0378. 有序矩阵中第K小的元素 [Medium] [Kth Smallest Element in a Sorted Matrix]](https://leetcode.com/pro ...
- 【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 解答 ...
- leetcode 二分查找 Search in Rotated Sorted ArrayII
Search in Rotated Sorted Array II Total Accepted: 18500 Total Submissions: 59945My Submissions Follo ...
- LeetCode——二分查找
二分查找 目录 二分查找法 求开方 大于给定元素的最小元素 有序数组的 Single Element 第一个错误的版本 旋转数组的最小数字 查找区间 1. 二分查找法 正常实现 public int ...
- leetcode二分查找
1.猜数字进行二分查找: 2.查找两个数组之间的重复交叉项 转载于:https://www.cnblogs.com/mmziscoming/p/5777008.html
- 【leetcode/二分】有效的完全平方数(夹逼二分)
问题描述: 给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False. 说明:不要使用任何内置的库函数,如 sqrt. 示例 1: 输入:16 输 ...
- LeetCode二分查找问题全集
文章目录 二分查找框架 704. 二分查找 33. 搜索旋转排序数组 81. 搜索旋转排序数组 II 153. 寻找旋转排序数组中的最小值 154. 寻找旋转排序数组中的最小值 II 300. 最长上 ...
最新文章
- python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解
- iOS开发面试题整理
- hadoop集群的搭建(分布式安装)
- 新款iPhone SE并未搭载U1超宽带芯片,后续恐不支持AirTag
- IceE-1.3.0的移植过程及错误Time.h:36: error: expected type-specifier before ‘time-转
- python排序算法——快速排序时间复杂度O(nlogn)
- 3dmax 2022卸载方法,怎么完全彻底卸载删除清理干净3dmax 2022各种残留注册表和文件?
- Oracle--同义词详解
- (1)	创建一个Customer ,名字叫 Jane Smith, 他有一个账号为1000,余额为2000元,年利率为 1.23% 的账户。 (2)	对Jane Smith操作。 存入 100 元,再
- 2020-10-27 史上最全最新机器人领域期刊总结
- 如何修改PDF文件,PDF怎么插入图片
- 配置Linaro toolchain交叉编译工具
- java 中counter什么意思_方便适用的计数器Counter
- Tacotron2 NVIDIA版本优化停顿问题之Biao-Bei数据PhonePrssCrystal
- supermap javascript 点聚合
- android看黑白电子书软件,如何优雅解决App启动黑白屏
- YOLOV5:在本地电脑训练模型
- 2020.07 学习日记
- 公共供水管网漏损治理智能化管理系统解决方案
- 逛一逛大唐不夜城 2019-08-04
热门文章
- popen 使用方法
- 主驾没人!深圳允许自动驾驶汽车合法上路,图扑为车联网加速度
- JS高级-ES6语法汇总及案例练习
- drop/truncate purge
- poj 3208 Apocalypse Someday 数位dp+二分答案
- 华为海思系列芯片开发学习中常见缩写详解
- 你到国外去旅游,那里的人都讲英语,虽然你的英语不怎么好,但你会编程,请编写一段程序,利用文件“dict.txt”,把英文单词译成中文,帮助与人沟通。
- 运算放大器工作原理及选择
- 米拓模板:农业农产品公司网站模板推荐
- 突发公共卫生事件3D 可视化 | 新冠肺炎案例