首页 > 其他分享 >【LeetCode 刷题】二分搜索

【LeetCode 刷题】二分搜索

时间:2025-01-14 17:04:08浏览次数:3  
标签:二分 right nums int self while 刷题 LeetCode left

此博客作为《代码随想录》的学习笔记,主要内容为二分搜索法及相关题目解析。

文章目录

以下所有二分法算法均基于左闭右闭区间

704. 二分查找

LeetCode 题目链接

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (right - left) // 2 + left
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return -1
  • while 循环的条件为 <=,不是 <
  • right 更新为 mid - 1,不是 mid

35.搜索插入位置

LeetCode 题目链接

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (right - left) // 2 + left
            if nums[mid] == target:
                return mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                right = mid - 1
        return left
  • 跳出 while 循环后,结果一定为 left 指针在 right 指针的右侧下一个的位置,即 left = right + 1
  • 返回 leftright + 1 均可

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

LeetCode 题目链接

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

    def searchRange(self, nums: List[int], target: int) -> List[int]:
        left = self.upperBound(nums, target - 1)  # 左边界
        right = self.upperBound(nums, target) - 1  # 右边界
        
        if left <= right and right < len(nums) and nums[left] == target and nums[right] == target:
            return [left, right]
        return [-1, -1]
  • upperBound 寻找上界,即第一个 > 目标值的位置
  • 二分查找后返回元素的判断技巧
    • 跳出 while 循环后,left = right + 1,也表明着两个指针现在互相进入了对方的区间,即左指针指向的元素满足的右区间的要求
    • 以上题为例, left 指针指向的元素满足右区间的判断条件,即 nums[left] > target;right 指针指向元素满足左区间的判断条件,即 nums[right] = nums[left-1] <= target
    • 因此返回 left,则找到了第一个 > 目标值的位置

69.x 的平方根

LeetCode 题目链接

class Solution:
    def mySqrt(self, x: int) -> int:
        left, right = 0, x
        while left <= right:
            mid = (right - left) // 2 + left
            if mid * mid <= x:
                left = mid + 1
            else:
                right = mid - 1
        return right
  • right 对应第一个满足 num * num <= x 的元素

367.有效的完全平方数

LeetCode 题目链接

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

标签:二分,right,nums,int,self,while,刷题,LeetCode,left
From: https://blog.csdn.net/Bran_Liu/article/details/145130377

相关文章

  • 【代码随想录】刷题记录(102)-不同路径 II
    题目描述:给定一个 mxn 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m-1][n-1])。机器人每次只能向下或者向右移动一步。网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有......
  • 打卡信奥刷题(599)用C++信奥P7852[普及组/提高] 「EZEC-9」Yet Another Easy Problem
    「EZEC-9」YetAnotherEasyProblem题目描述给定n,mn,mn,m,你需要输出一个长度为......
  • leetcode 刷题
    现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:只能从架子的左上角开始拿珠宝每次可以移动到右侧或下侧的相邻位置到达珠宝架子的右下角时,停止拿取注意:珠宝的价值都是大于0的。除非这个架子上没有任何珠宝,比如 frame=[......
  • LeetCode:215.数组中的第K个最大元素
    LeetCode:215.数组中的第K个最大元素解题思路看到“第K个最大元素”。考虑选择使用最小堆。解题步骤构建一个最小堆,并依次把数组的值插入堆中。当堆的容量超过K,就删除堆顶。插入结束后,堆顶就是第K个最大元素。leetcode在线运行测试可能是用本地环境跑分...有缓存卡大数有er......
  • leetcode刷题记录(java)——参考代码随想录:数组 链表 哈希表
    四、题目之:代码随想录https://programmercarl.com/(1)代码随想录:数组704.二分查找classSolution{publicintsearch(int[]nums,inttarget){if(target<nums[0]||target>nums[nums.length-1]){return-1;}intleft=0......
  • SQL刷题快速入门(二)
    其他章节:SQL刷题快速入门(一)承接上一章节,本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分运算符SQL支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下是一些常见的SQL运算符类型及其示例:算术运算符+(加)-(减)*(乘)/(除)%(取模)SELECT......
  • LeetCode Top Interview 150 - Stack
    Somescenarioswhereastackistypicallytheappropriatedatastructuretouse:1.ParenthesesMatching:Problemsthatrequirecheckingforbalancedparenthesesorbracketsoftenutilizestackstoensurethateveryopeningbrackethasacorrespondingclo......
  • java面试刷题系统设计论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着就业市场竞争的日益激烈,面试在求职过程中的重要性愈发凸显。如今,计算机技术的广泛应用为面试准备提供了新的途径。在传统的面试准备过程中,求......
  • LeetCode 热题 HOT 100
    点个关注,不迷路!(╯▽╰)好香~~在学习过程中,借助一些优秀的工具可以极大地提升我们的学习效率。例如,使用LeetCode插件,它能够帮助你显示力扣周赛难度分数,让你更好地了解题目的难度,从而合理安排学习计划。算法学习路线推荐基础夯实:先过B站“灵茶山艾府”的“基础算法......
  • leetcode周赛432 T4(单调栈 + 单调队列)
    一道练习单调栈+单调队列的好题题目链接:problem对于求合法子数组数量的题目,可以先考虑传统的枚举右端点,二分左端点的套路。此题用这种方法恰好可行,因为对于一个序列,左端增加一个数不会让操作数更少。因此对于固定右端点,合法的左端点一定是一段区间。所以现在问题转化为:用双指......