力扣——二分法总结(python)

二分法

假如存在一个数组[1,9],这个数组是1到9有序排列,不重复的9个数。给出一个target,假设target=8,输出target在数组中的索引值。
力扣——二分法总结(python)_第1张图片
通过二分法来解决:

  1. 确定数组的左右边界,以及中间点
  2. 比较中间点和target的大小
  • 如果中间点=target:返回中间点的索引值
  • 如果中间点>target:right = mid -1,更新mid位置
  • 如果中间点

这就是整个二分法的算法思路了,就是不断的对半缩短检索区域。因此二分法也叫折半搜索(binary search)。

力扣.704二分查找
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        n = len(nums)
        left = 0
        right = n-1
        while left<=right:
            middle = left+(right-left)//2 # 防止溢出 等同于(left + right)/2
            if nums[middle] > target:
                right = middle-1
            elif nums[middle] < target:
                left = middle+1
            else:
                return middle
        return -1

当然也可以抖机灵

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if target in nums:
            return nums.index(target)
        else:
            return -1

力扣.69Sqrt(x)
题目:给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

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

力扣.367有效的完全平方数
题目:给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
注意:不要 使用任何内置的库函数,如 sqrt 。

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

力扣.34在排序数组中查找元素的第一个和最后一个位置
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。(有难度)

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        if target not in nums:return [-1,-1]
        path = []
        left,right=0,len(nums)-1
        # 确定左边界
        while left<right:
            mid = (left+right)//2
            if nums[mid]>=target:
                right = mid
            else:
                left = mid+1
        path.append(left)
        if nums[left] != target:
            return [-1,-1]
        left,right=0,len(nums)-1
        #确定右边界
        while left<right:
            mid = (left+right+1)//2
            if nums[mid]<=target:
                left = mid
            else:
                right = mid-1
        path.append(right)
        return path

完~

你可能感兴趣的:(力扣刷题总结,python)