leetcode分类刷题:二分查找(Binary Search)(二、隐藏有序序列的数学类型)

2023-11-20

参加了下2023届秋招,不得不感叹leetcode&lintcode的题目实在太多了(也很难),特别对于我这种非科班生而言,感觉有必要分类整理一下,以便以后在工作中更好的应用。花了点时间刷了下二分查找的相关题目,刷的越多,反而越不会了,先把目前遇到的几个题目总结下吧。

隐藏有序序列的数学类型题目主要是与平方根有关系,给定的数字是序列的最大值,目标值是该数的平方根(整数部分),判断给定的数字是否是完全平方数,平方根的整数部分也常常会作为特定题目用于双指针法求解的边界,从而降低算法复杂度。

69. x 的平方根

'''
69. x 的平方根
题目描述:给你一个非负整数 x ,计算并返回x的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
    输入:x = 8
    输出:2
    解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
题眼:隐藏有序数组且无重复:0、1、2...x-1、x,
思路:二分查找。相当于是“35. 搜索插入位置”的升级版,在隐藏有序序列中寻找平方根的整数部分,完全平方数就返回平方根,否则返回循环结束的right值,
'''


class Solution:
    def mySqrt(self, x: int) -> int:
        left, right = 0, x  # 这里right取值应该是x,因为x<=1时,均方根是x本身
        while left <= right:
            mid = left + (right - left) // 2
            if mid * mid > x:
                right = mid - 1
            elif mid * mid < x:
                left = mid + 1
            else:
                return mid
        return right  # 掌握循环跳出时的临界状态


if __name__ == '__main__':
    obj = Solution()
    while True:
        try:
            num = int(input().strip().split()[-1])
            print(obj.mySqrt(num))
        except EOFError:
            break

367. 有效的完全平方数

'''
367. 有效的完全平方数
题目描述:给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
    输入:num = 16
    输出:true
题眼:隐藏有序数组且无重复:1、2...x-1、x
思路:二分查找 —— 和 “69. x 的平方根”题目一样
'''


class Solution:
    def isPerfectSquare(self, num: int) -> bool:
        left, right = 1, num
        while left <= right:
            mid = left + (right - left) // 2
            if mid * mid > num:
                right = mid - 1
            elif mid * mid < num:
                left = mid + 1
            else:
                return True
        # 在序列中,但是找不到target
        return False


if __name__ == '__main__':
    obj = Solution()
    while True:
        try:
            num = int(input().strip().split()[-1])
            print(obj.isPerfectSquare(num))
        except EOFError:
            break

633. 平方数之和

'''
633. 平方数之和
题目描述:给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 1:
    输入:c = 5
    输出:true
    解释:1 * 1 + 2 * 2 = 5
题眼:隐藏有序数组且无重复:0、1、2...c-1、c
思路:这道题最核心的就是要想到 双指针法 的下边界是int(sqrt(c))——也可以直接调用sqrt函数,否则会超时
'''
import math


class Solution:
    def judgeSquareSum(self, c: int) -> bool:
        # 第一步,二分查找找到c的 平方根的整数部分
        # sqrtV = self.searchSqrt(c)
        sqrtV = int(math.sqrt(c))
        # 第二步,双指针法判断c是否是两个平方数之和
        left, right = 0, sqrtV
        while left <= right:
            if left * left + right * right > c:
                right -= 1
            elif left * left + right * right < c:
                left += 1
            else:
                return True
        return False

    # def searchSqrt(self, c: int) -> int:
    #     left, right = 0, c
    #     while left <= right:
    #         mid = left + (right - left) // 2
    #         if mid * mid > c:
    #             right = mid - 1
    #         elif mid * mid < c:
    #             left = mid + 1
    #         else:
    #             return mid
    #     return right  # 掌握循环跳出时的临界状态


if __name__ == '__main__':
    obj = Solution()
    while True:
        try:
            num = int(input().strip().split()[-1])
            print(obj.judgeSquareSum(num))
        except EOFError:
            break

个人总结体会

1、对于 隐藏有序序列的数学类型 的二分法的使用,同时把target值也隐藏了,目前遇到的题目都是把target默认为均方根值,在明白到这一点之后,继续根据二分查找(Binary Search)(一、基于索引(定义域)的类型)掌握的关键点:准确把握循环终止时的状态,即left和right指针的相对位置关系(左闭右闭区间法则下是left-right=1),就能轻松应对这类题目。
2、对于"633. 平方数之和"这种复合型的题目,第一步用二分法找到均方根值(边界位置)、第二步用双指针判断是否是平方数,思路上不是一下子就能想到,还是要多加练习…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode分类刷题:二分查找(Binary Search)(二、隐藏有序序列的数学类型) 的相关文章

随机推荐

  • shell入门学习-位置变量

    1 位置变量定义 在执行脚本或命令时 传递给脚本或命令的参数 2 位置变量demo效果如下图 3 1 sh脚本如下 4 注意 如果脚本后面不输入任何参数 如下图所示 如果脚本后面只添加1个数据 如下图所示 如果脚本后面的参数超过脚本定义的位
  • 解决Review Manager(RM)很卡的方法(方法来源网络)

    1 断网 禁用网络连接 拔网线等均行 看你喜欢 2 利用Windows Win10 自带防火墙程序禁止RM联网 控制面板 网络和internet 系统和安全 windows defender防火墙 高级设置 出站规则 新建规则 下一步 此程
  • jquery的ajax获取后台数据

    前言 这里获取了小米商城的一个后台地址 效果图 源码 div p 后台拿到的总数 span style color red font size 18px span p hr ul ul div
  • 基础知识十一、Python解析网络报文之TCP首部报文解析

    文章目录 一 TCP首部解析器的实现 二 测试逻辑 上一节解析了 IP首部报文后 本节继续解析TCP报文首部 TCP协议处于OSI七层模型的传输层 传输层的作用就是负责管理端到端的通信连接问题 连续ARQ automatic repeat
  • 初始泛型类

    泛型的顶级理解 一 包装类 1 基本数据类型和对应的包装类 2 装箱和拆箱 3 自动装箱和拆箱 二 泛型 1 语法 2 泛型类的使用 3 示例 4 擦除机制 5 泛型上界 6 示例和复杂示例 7 泛型方法 一 包装类 在Java中 由于基本
  • JAVA 【爬虫】 Selenium 无头浏览,禁止加载图片,启动参数,失效,无效

    JAVA Selenium 无头浏览 禁止加载图片 启动参数 失效 无效 可能有如下几个原因 代码问题 命令参数写错 无头浏览 headless 禁止加载图片 blink settings imagesEnabled false Chrom
  • DS1302芯片介绍

    低功耗时钟芯片DS1302可以对年 月 日 时 分 秒进行计时 且具有闰年补偿等多种功能 DS1302的性能特性 实时时钟 可对秒 分 时 日 周 月以及带闰年补偿的年进行计数 用于高速数据暂存的31 8位RAM 最少引脚的串行I O 2
  • MySQL安装与使用(Windows)

    Windows平台提供了两种安装MySQL的方式 1 图形化安装 msi安装文件 链接 link 2 免安装 zip压缩文件 链接 link 安装MySQL 一 图形化安装 1 双击下载的 MySQL 安装文件 进入 MySQL 安装界面
  • Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言 首先需要区分一下关闭socket和关闭TCP连接的区别 关闭TCP连接是指TCP协议层的东西 就是两个TCP端之间交换了一些协议包 FIN RST等 具体的交换过程可以看TC
  • 虚拟机三种网络模式

    基本知识 ipconfig查看信息 网关 Gateway 又称网间连接器 协议转换器 是你连接到的上层节点的地址 ip地址是你本身的地址 如果是路由器分配的 那么是路由器所构建的内网地址 网卡 需要网卡才能连接其他设备 是设备端的 交换机
  • vscode+phpstudy配置php环境

    1 先打开phpstudy 将WAMP启动 2 点击左侧的软件管理 随便选一个版本的php安装 我这里下的是5 3 29版本的 3 点击上面的系统环境 找到刚刚安装好的php 进入设置 点击扩展选项 将XDebug调试组件打开 并记下端口
  • MEF:COA-NET

    COA NET COLLABORATIVE ATTENTION NETWORK FOR DETAIL REFINEMENT MULTI EXPOSURE IMAGE FUSION COA NET 用于细节细化多曝光图像融合的协作关注网络 近
  • [Js进阶]如何用jquery获取到shadowRoot里的内容

    HTML组件相关的标准 HTML Template Shadow DOM 则是原生组件封装的基本工具 它可以实现组件与组件之间的独立性 Custom Elements 是用来包装原生组件的容器 通过它 你就只需要写一个标签 就能得到一个完整
  • python计算工资编程-Python实现扣除个人税后的工资计算器示例

    本文实例讲述了Python实现扣除个人税后的工资计算器 分享给大家供大家参考 具体如下 正好处于找工作期间避免不了会跟单位谈论薪资的情况 当然所有人跟你谈的都是税前收入 税后应该实际收入有多少呢 今天就简单写一个个人税收收入计算器 仅仅是觉
  • Linux下uboot编译出错(/bin/bash: arm-none-linux-gnueabi-gcc: command not found )

    unboot压缩包解压 tar xz 在终端进入解压目录 xz d tar xz tar xvf tar 向Makefile添加编译路径 在makefile的开头添加本机的编译路径 ARCH arm CROSS COMPILE opt fs
  • 【error】org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/geoserver]启动失败

    error org apache catalina core StandardContext startInternal 由于之前的错误 Context geoserver 启动失败 tomcat10配置geoserver war包启动错误
  • Android 一些常见BUG汇总(持续更新)

    写在前面的话 每个开发者在工作中会遇到或多或少的小bug 这里博主把它们记录下来 以便以后查阅 开始 1 file storage emulated 0 DCIM xxx jpg exposed beyond app through Cli
  • [SDOI2012]拯救小云公主【bfs+二分答案】

    题目链接 正难则反 要直接求从起点到终点的最大距离 不妨反过来求最小的可以阻止骑士从起点到终点的对于全体圆的最小半径 那么 就是阻止从左上角到右下角的所有相交圆 于是 就是要变成没有从左上角到右下角的相交圆才可以 那么不妨跑一个bfs来判断
  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • leetcode分类刷题:二分查找(Binary Search)(二、隐藏有序序列的数学类型)

    参加了下2023届秋招 不得不感叹leetcode lintcode的题目实在太多了 也很难 特别对于我这种非科班生而言 感觉有必要分类整理一下 以便以后在工作中更好的应用 花了点时间刷了下二分查找的相关题目 刷的越多 反而越不会了 先把目