• 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
    
  • 相关阅读:
    【原】PHP从入门到精通2小时【图文并茂】
    VMware虚拟机扩容
    linux修改固定IP
    According to TLD or attribute directive in tag file, attribute items does not accept any expressions
    eclipse juno 怎么安装maven
    MySQL的ROUND函数
    GitHub如何删除一个代码仓库
    win7企业版激活
    git-中文乱码
    Eclipse各个版本及其对应代号、下载地址列表【转】
  • 原文地址:https://www.cnblogs.com/aimoboshu/p/15350243.html
Copyright © 2020-2023  润新知