Leetcode数组-二分法

Leetcode数组-二分法

二分法学习地址

二分法

704. 二分查找

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

class Solution():
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        左闭右开
        """ 
        left, right = 0, len(nums)
        while left < right:
            middle = (left + right) // 2
            if nums[middle] < target:
                left = middle + 1
            elif nums[middle] > target:
                right = middle
            else :
                return middle
        return -1

35. 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left, right = 0, len(nums) - 1

        while left <= right:
            middle = (left + right) // 2
            if nums[middle] < target:
                left = middle + 1
            elif nums[middle] > target:
                right = middle - 1
            else:
                return middle
        return right + 1

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

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:

你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

class Solution(object):
    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        # 判断边界
        if len(nums) == 0:
            return [-1,-1]
        elif target<nums[0] or target>nums[-1]:
            return [-1,-1]
        else:
            # 搜索目标
            left, right = 0, len(nums) - 1
            while left <= right:
                middle = (left + right) // 2
                if nums[middle] < target:
                    left = middle + 1
                elif nums[middle] > target:
                    right = middle - 1
                # 当找到相等的值时,把左右指针合并并分别向左向右依次遍历找出上下限
                elif target == nums[middle]:
                    left, right = middle, middle
                    while left-1 >= 0 and nums[left-1] == target:
                        left -= 1
                    while right+1 <= len(nums)-1 and nums[right+1] == target:
                        right += 1
                    return [left, right]
            return [-1,-1]

69. Sqrt(x)

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

# 牛顿迭代法
class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x==0:
            return 0
        a = x0 = float(x)
        while True:
            xi = (x0 + a/x0) * 0.5
            if abs(xi - x0) < 1e-7:
                break
            x0 = xi
        return int(x0)
# 二分法
class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        l, r, a = 0, x, -1
        while l <= r:
            mid = (l + r) // 2
            if mid * mid <= x:
                a = mid
                l = mid + 1
            else:
                r = mid - 1
        return a
posted @ 2021-09-28 21:46  薄书  阅读(44)  评论(0编辑  收藏  举报