参考这个刷题指引
对二分查找的leetcode题目做了几道
以下是学校老师讲的二分查找的模板,我感觉非常的好记
解释
具体就是需要确定要查找的序列是升序还是降序,以升序为例,查找的位置又可分为四种,是否取等,以及上下界。
关于实现细节,建议left和right采用左闭右开的区间。
四个查找位置又可以转化为两个查找位置,另外两个可以由这两个转换得到,只用记>=target和>target的情况。<target可以由>=target的位置-1得到,<=target可以由>target的位置-1得到。
状态转移时:
当查找>=target的位置时,当f(mid)>=target时,转移r=m,否则转移l=m+1。
当查找>target的位置时,当f(mid)>target时,转移r=m,否则转移l=m+1。
最终返回l的位置即为答案。
mid=l+(r-l)//2时为了防止溢出
35题
这道题查找的位置是第一个>=target的位置,因此代码如下。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
l = 0
r = len(nums)
m = -1
while l < r:
m = l + (r-l)//2
# print(m)
if nums[m] >= target:
r = m
else:
l = m+1
return l
34题
这道题需要查找两个位置,一个是>=target的位置,一个是<=target的位置,后者我们采用找>target的位置,然后减1得到。
需要注意,找到的位置的值,可能和target不相等,这时要返回-1。代码如下
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
res1, res2 = -1, -1
if len(nums) == 0:
return [res1, res2]
l , r = 0, len(nums)
while l<r:
m = l + (r-l)//2
if nums[m]>=target:
r = m
else:
l = m + 1
if l < len(nums) and nums[l] == target:
res1 = l
l , r = 0, len(nums)
while l<r:
m = l + (r-l)//2
if nums[m]>target:
r = m
else:
l = m + 1
if l>0 and nums[l-1] == target:
res2 = l-1
return [res1, res2]
69题
这道题是一个二分答案的题目,不多想的话,在1~x之间查找m,找到m**2<=target的位置,代码如下。
class Solution:
def mySqrt(self, x: int) -> int:
l = 1
r = x+1
while l<r:
m = l +(r-l)//2
if m**2 > x:
r = m
else:
l = m+1
return l - 1
367题
和69题类似,找到后判断m**2和target是否相等,代码如下
class Solution:
def isPerfectSquare(self, num: int) -> bool:
l, r = 0, num+1
while l<r:
m = l +(r-l)//2
if m**2 > num:
r = m
else:
l = m+1
if (l-1)**2 == num:
return True
else:
return False
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/133486.html