Python刷力扣-数组专题-二分查找

Python刷力扣-数组专题-二分查找

35.搜索插入位置

题目链接35.搜索插入位置

思路:二分查找

代码

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left,right = 0,len(nums)-1
        while left<=right:
            #python里这里要用整除符号//而不是/
            middle = left+(right-left)//2
            if target < nums[middle]:
                right = middle-1
            elif target > nums[middle] : 
                left = middle+1
            else :
                return middle
        #这里也可以return right+1 可以手动模拟一下
        return left

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

题目链接34. 在排序数组中查找元素的第一个和最后一个位置

思路:二分查找加一点改进

代码

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        ans = [-1]*2
        left,right = 0,len(nums)-1
        while left<=right:
            middle = left + (right-left)//2
            if(target<nums[middle]):
                right=middle-1
            elif(target>nums[middle]):
                left=middle+1
            #从左向右同时遍历,主要改动在这部分
            else:
				#注意这里range第二个参数是-1,如果是0的话就错了
                for i in range(middle,-1,-1):
                    if target==nums[i]:
                        ans[0]=i
                for i in range(middle,len(nums)):
                    if target==nums[i]:
                        ans[1]=i
                break
        return ans

69. x 的平方根

题目链接69. x 的平方根

思路:二分查找加一点改进

代码:

class Solution:
    def mySqrt(self, x: int) -> int:
        left,right = 0,x
        while(left<=right):
            mid = left+(right-left)//2
            if mid*mid < x :
                left=mid+1
            elif mid*mid > x :
                right=mid-1
            else:
                return mid
        return right

对于return right的解释:
1.是mid*mid正好是x,这个直接返回了
2.跳出while循环时right小于了left,所以这个根号下的数不会有正好的整数解的,需要取整,本题要向下取整,哪是下??? right现在在下面啊

367. 有效的完全平方数

题目链接367.有效的完全平方数

思路:二分查找

代码:

class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        if num==1:
            return True
        left,right = 1,num-1
        while left<=right:
            middle = left+(right-left)//2
            if num>middle*middle:
                left=middle+1
            elif num<middle*middle:
                right=middle-1
            else:
                return True
        return False

这里要注意:
num=1的时候要单独考虑

你可能感兴趣的:(python,leetcode,力扣)