IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣算法题总结(python)—二分查找 -> 正文阅读

[数据结构与算法]力扣算法题总结(python)—二分查找

二分查找:

二分法写法:

二分法的写法共分两种分别是:1.定义target在左闭右闭区间 2.定义target在左闭右开区间。
方法1. 定义target在左闭右闭区间,即[left, right]
1.while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=。
2.if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle – 1。

方法2. 定义target在左闭右闭区间,即[left, right)
1.while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的。
2.if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]。


二分法力扣相关题目:

35.搜索插入位置
34.在排序数组中查找元素的第一个和最后一个位置
69.x 的平方根
367.有效的完全平方数


答案与解析:

35.搜索插入位置

题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。

解析

要在数组中插入目标值总共有四种情况:
1.目标值在数组所有元素之前
2.目标值等于数组中某一个元素
3.目标值插入数组中的位置
4.目标值在数组所有元素之后
在这里插入图片描述

python 代码

方法1

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left, right=0, len(nums)-1  #左闭右闭区间

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

方法2:

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


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

题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。

解析

寻找target在数组里的左右边界,有如下三种情况:
情况一:target 在数组范围的右边或者左边,例如数组{3, 4, 5},target为2或者数组{3, 4, 5},target为6,此时应该返回{-1, -1}
情况二:target 在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1, -1}
情况三:target 在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1, 1}

python 代码

方法1:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        def getRightBoder(nums,target):
            left, right = 0, len(nums)-1
            rightboder=-2
            while left <= right:
                middle = left+(right-left)//2
                if nums[middle]>target:
                    right=middle-1
                else:
                    left=middle+1
                    rightboder=left
                
            return rightboder

        def getLeftBoder(nums,target):
            left, right = 0, len(nums)-1
            leftboder=-2
            while left <= right:
                middle = left+(right-left)//2
                if nums[middle]>=target:
                    right=middle-1
                    leftboder=right
                else:
                    left=middle+1
                
            return leftboder

        leftboder=getLeftBoder(nums,target)
        rightboder=getRightBoder(nums,target)

        #情况一
        if leftboder==-2 or rightboder==-2: return [-1,-1]
        #情况三
        if rightboder-leftboder>1: return [leftboder+1,rightboder-1]
        #情况二
        return [-1,-1]

方法2:

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        def binarySearch(nums,target):
            left, right = 0, len(nums)-1
            while left <= right:
                middle = left+(right-left)//2
                if nums[middle]>target:
                    right=middle-1
                elif nums[middle]<target:
                    left=middle+1
                else:
                    return middle
            return -1

        index=binarySearch(nums,target)
        #情况一,情况二
        if index==-1: return [-1,-1]
        #情况三
        left, right = index, index
        while left-1 >0 and nums[left-1]==target: left-=1
        while right+1 < len(nums) and nums[right+1]==target: right+=1
        return [left,right]


69.x 的平方根

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

python 代码

方法:

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


367.有效的完全平方数

题目:给定一个正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

方法:

class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        left, right=0,num
        while left<=right:
            middle = left+(right-left)//2
            square = middle*middle
            if square > num:
                right=middle-1
            elif square < num:
                left=middle+1
            else:
                return True
        return False
        
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:43:30  更:2022-03-16 22:49:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:40:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码