概述
往期内容在这里:
往期01-05
往期06-10
往期11-15
往期16-20
数组篇01
数组篇02
数组篇03
数组篇04
动态规划篇
动态规划进阶(与矩阵相关)
动态规划再进阶(序列类动态规划问题)
大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,这期为--二分查找篇,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)这篇更新6篇,艾瑞巴迪和我一起刷起来!!
200道大数据面试常考Leetcode算法题 (二分查找篇)34-在排序数组中查找元素的第一个和最后一个位置
Leetcode原题为:
题解为:
class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: # 左右端点 l, r = 0, len(nums)-1 # 从左往右循环 while l <= r: # 找到中间值的索引 mid = (l+r)//2 # 假如中间值就算目标值 if nums[mid] == target: # 找到中间值左边开始索引跟右边开始索引 if nums[l] == target and nums[r] == target: return [l,r] # 没找到 左边右移一位 if nums[l] != target: l += 1 # 没找到 右边左移一位 if nums[r] != target: r -= 1 # 假如目标值大于中间值,则l,r 都在mid右边 elif nums[mid] < target: # 则重新定义左边从中间值开始变大 l = mid + 1 # 假如目标值小于中间值,则l,r 都在mid左边 else: # 则重新定义右边值从中间值开始变小 r = mid - 1 # 没有即返回-1,-1 return [-1,-1]
200道大数据面试常考Leetcode算法题 (二分查找篇)69-x 的平方根
Leetcode原题为:
题解为:
class Solution(object): def mySqrt(self, x): # 左边界,因数 low, high = 0, x # 当左边界小于等于因数,开始循环 while (low <= high): # 找到中值 mid = (low + high) // 2 # 假如因数平方大于目标值,说明最终符合因数在当前中值的左边边,那么因数减一 if mid * mid > x: high = mid - 1 # 否则最终符合因数在当前中值的右边 else: low = mid + 1 # 退出循环,输出当前的因数 return int(high)
200道大数据面试常考Leetcode算法题 (二分查找篇)74-搜索二维矩阵
Leetcode原题为:
题解为:
class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: # 对列表的每个列表开始循环 for list in matrix: # 左右边界 l, r = 0, len(list)-1 # 左边界小于等于有边界 while l <= r: # 找到中值 mid = (l+r)//2 # 假如当前列表的中值为目标值,是即返回True if list[mid] == target: return True # 假如当前列表的中值小于目标值,说明目标值在中值的右边,左边界变为中值开始加一 elif list[mid] < target: l = mid+1 # 假如当前列表的中值大于目标值,说明目标值在中值的左边,右边界变为中值开始减一 else: r = mid-1 # 假如找不到目标值即返回False return False
200道大数据面试常考Leetcode算法题 (二分查找篇)153-寻找旋转排序数组中的最小值
Leetcode原题:
题解为:
class Solution: def findMin(self, nums: List[int]) -> int: # 左右边界 l,r = 0,len(nums)-1 # 左边界小于右边界开始循环 while(l < r): # 计算中值索引 mid = (l + r) // 2 # 假如中值大于右边界,说明最小值在右边界,重新开始让区间左边界变为从中值+1 if(nums[mid] > nums[r]): l = mid+1 # 假如中值小于等于右边界,说明最小值在左边界,重新开始让区间右边界变为从中值开始 else: r = mid # 最后当左右边界相同的时侯,即找到最小值 return nums[l]
200道大数据面试常考Leetcode算法题 (二分查找篇)278-第一个错误的版本
Leetcode原题为:
题解为:
class Solution: def firstBadVersion(self, n): # 定义左右边界,因为是版本是一个个体,所以从1开始 l,r = 1,n # 当左边界小于右边界循环 while (l<r): # 找到中间索引 mid = (l+r)//2 # 判断中值是否为错误版本,假如是, # 即表示第一个错误版本在左边,重新开始让区间右边界变为从中值开始 if isBadVersion(mid): r = mid # 否则表示第一个错误版本在右边,重新开始让区间左边界变为从中值+1开始 else: l = mid+1 # 当左右边界相等时即找到第一个错误版本 return l
200道大数据面试常考Leetcode算法题 (二分查找篇)540-有序数组中的单一元素
Leetcode原题为:
题解为:
class Solution: def singleNonDuplicate(self, nums: List[int]) -> int: l,r = 0,len(nums)-1 while(l < r): mid = (l+r) // 2 # 右侧数组为偶数 halvesAreEven = (l - mid) % 2 == 0 # 假如中值和中值后面的数是一对时 if(nums[mid] == nums[mid + 1]): # 否则右侧数组为偶数,说明单一数字在右侧,重新开始让区间左边界变为从中值+2开始 # 因为中值右侧有一个跟中间相同,所以不能右侧此时不能是偶数 if(halvesAreEven): l = mid + 2 # 否则左侧数组为偶数,说明单一数字在右侧,重新开始让区间左边界变为从中值+2开始 else: r = mid - 1 # 假如中值和中值前面的数是一对时 elif(nums[mid] == nums[mid - 1]): # 假如右侧数组为偶数,说明单一数字在左侧,重新开始让区间右边界变为从中值-2开始 if(halvesAreEven): r = mid -2 # 否则左侧数组为偶数,说明单一数字在右侧,重新开始让区间左边界变为从中值+1开始 else: l = mid + 1 # 否则中值就是单一数字 else: return nums[mid] # 当左右边界相同时,即找到单一数字 return nums[l]
好啦,这期的分享到这里结束啦!我们下期(位运算篇)再见!
最后
以上就是故意芹菜为你收集整理的200道大数据面试常考Leetcode算法题--二分查找篇(python带代码解析)往期内容在这里:大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,这期为--二分查找篇,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)这篇更新6篇,艾瑞巴迪和我一起刷起来!!200道大数据面试常考Leetcode算法题 (二分查找篇)34-在排序数组中查找元素的第一个和最后一个位置200道大数据面试常考Leetcode算法题 (二分查找篇)69-x的全部内容,希望文章能够帮你解决200道大数据面试常考Leetcode算法题--二分查找篇(python带代码解析)往期内容在这里:大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,这期为--二分查找篇,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)这篇更新6篇,艾瑞巴迪和我一起刷起来!!200道大数据面试常考Leetcode算法题 (二分查找篇)34-在排序数组中查找元素的第一个和最后一个位置200道大数据面试常考Leetcode算法题 (二分查找篇)69-x所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复