leetcode 69. x 的平方根(优质解法)

代码:

class Solution {
    public int mySqrt(int x) {
        long left=0;
        long right=x;

        while (left<right){
            long mid=left+(right-left+1)/2;
            //注意乘法操作和加法操作都很容易发生溢出
            if(mid*mid<=x){
                left=mid;
            }else {
                right=mid-1;
            }
        }

        return (int)left;
    }
}

题解:

        本题的题意表述得很清晰,x 是一个非负整数,我们要算出 x 的平方根,当平方根是小数时,要把小数部分省略

        首先我们可以想到一个暴力解法,x 的平方根肯定是小于等于 x 的,所以我们只需要遍历 0 - x 的数,找到 x 的平方根即可

        比如 x = 4,我们需要遍历 0,1,2,3,4,当 i = 2 时,2*2 =4 ,得到结果 2

0        1        2        3        4

                     i    

        比如 x =8 ,我们需要遍历 0,1,2,3,4,5,6,7,8 当 i =2 时,2*2 = 4 < 8,我们向前遍历,当 i = 3 时,3*3 = 9 > 8 ,所以我们得到 2 

0        1        2        3        4        5        6        7        8

                     i 

          我们可以将  0,1,2,3,4 和  0,1,2,3,4,5,6,7,8 这两个区间进行划分,【0,1,2】是i 的平方<= x 的区间,【3,4】是 i 的平方 > x 的区间; 【 0,1,2】是 i 的平方 <= x 的区间【3,4,5,6,7,8】是 i 的平方 > x 的区间

        我们可以看出,结果都是 <= x 的区间的右边界,当选取一个数位于 <= x 的区间,那么这个数左边的数便可以排除掉(不能排除该数,因为不确定该数是否就是我们要找的右边界),如果一个数位于 > x 的区间,那么这个数以及右边的数都可以排除掉

        通过上述分析我们就知道应该用二分法来解决这个问题

        以 x = 8 为例

        L 和 R 指针的下标就对应要遍历的值,首先获取中间值 mid = L+(R-L+1)/2 = 4,4*4 =16 位于 > x 的区间,我们就可以大胆去除 mid 及其右边的所有数,让 R 指针指向 mid -1 的位置

0        1        2        3        4        5        6        7        8

L                                     mid                                   R 

        获取中间值 mid = 2,此时 2*2 =4 < 8,位于 <= x 的区间,所以我们可以大胆去除 mid 左边的数(不能去除 mid ,因为不确定 mid 的值是不是我们要找的值),让 L = mid

0        1        2        3        4        5        6        7        8

L                 mid     R

        再取中间值,mid =3,位于 > x 的区间,我们让 R = mid-1

0        1        2        3        4        5        6        7        8

                     L        R

                              mid

        当 L 和 R 指针相遇时,我们便得到了相要获得的数

0        1        2        3        4        5        6        7        8

                     L        

                     R  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/246931.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FM30H12G N通道沟槽电源MOS管 封装形式PDFN5*6

FM30H12G 是一款 N通道沟槽电源的场效应管&#xff08;MOS管&#xff09;&#xff0c;封装形式&#xff1a;PDFN5*6。 来百度APP畅享高清图片 FM30H12G应用&#xff1a; 1、液晶电视 2、笔记本 3、电梯 4、感应加热 5、电动工具

基于JAVA的校园电子商城系统论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此校园购物信息的…

Linux 非阻塞网络IO模式

非阻塞网络IO模式介绍 当用户线程发起一个 read 操作后&#xff0c;并不需要等待&#xff0c;而是马上就得到了一个结果。如果结果是一个 error 时&#xff0c;它就知道数据还没有准备好&#xff0c;于是它可以再次发送 read 操作。一旦内核中的数据准备好了&#xff0c;并且又…

如何用CHAT写启发感想

问CHAT&#xff1a;写篇劳动教育课程给我带来的启发和影响 CHAT回复&#xff1a;自从我参加了学校的劳动教育课程&#xff0c;我深深地意识到劳动的重要性。这门课程通过让我们体验和认识各种劳动形式&#xff0c;提醒我去珍惜每一份来之不易的成果。接下来我想分享几个显著的观…

IntelliJ IDEA无公网环境远程访问Linux服务器进行开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

C++数据类型以及函数设计学习记录

一、C类型转换原则 当表达式中出现了多种类型数据的混合运算时&#xff0c;往往需要进行类型转换。表达式中的类型转换分为两种&#xff1a;隐式转换和显式转换&#xff0c;但此处仅对隐式转换进行总结。 隐式转换分为算术转换和其它隐式类型转换两大类&#xff0c;其它隐式类型…

智慧港口解决方案:PPT全文69页,附下载

关键词&#xff1a;智慧港口解决方案&#xff0c;数字化港口&#xff0c;智慧港口发展现状与展望&#xff0c;智慧码头&#xff0c;智慧港口发展趋势 一、智慧港口建设背景 随着数字经济、智慧交通发展&#xff0c;强调“要大力发展智慧交通和智慧物流”“努力打造世界一流的…

京东方将取代三星显示,引领可折叠面板市场 | 百能云芯

在智能手机市场蓬勃扩张的浪潮中&#xff0c;中国面板制造巨头京东方将在2023年第4季超越三星显示&#xff0c;引领可折叠面板市场。 据市调公司DSCC数据显示&#xff0c;今年下半年&#xff0c;原本独占鳌头的三星电子在可折叠手机市场的份额将从去年同期的86%降至72%&#xf…

一些好用的VSCode扩展

可以在扩展这里直接搜索需要的扩展&#xff0c;点击安装即可。 1.Chinese 中文扩展&#xff0c;就是说虽然咱们懂点英语&#xff0c;但还是中文看着方便 2.Auto Rename Tag 当你重命名一个HTML 标签时&#xff0c;会自动重命名与他配对的HTML 标签 当你选择h4这个标签时&…

PPT插件-好用的插件-放映笔、绘图板-大珩助手

放映笔 幻灯片放映时&#xff0c;工具在幻灯片的左下方&#xff0c;本工具在幻灯片的右侧&#xff0c;可以移动&#xff0c;可以方便在右侧讲课时候使用 绘图板 可在绘图板上写签名、绘制图画、写字等等&#xff0c;点画笔切换橡皮擦&#xff0c;点插入绘图&#xff0c;将背景…

用什么样的开源流程表单实现办公流程化?

近日&#xff0c;有不少热心网友询问道&#xff1a;如果要实现流程化办公&#xff0c;让整个办公效率火速提升上来&#xff0c;可以用什么样的开源流程表单工具&#xff1f;大伙都知道&#xff0c;随着低代码开发平台的盛行&#xff0c;办公效率也得到很大的提升&#xff0c;它…

【LeetCode: 2415. 反转二叉树的奇数层 | BFS + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法

针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法 文章目录 针对基于nohup后台运行PyTorch多卡并行程序中断问题的一种新方法Abstractscreen和tmux介绍tmux常用命令以及快捷键Byobu简单操作步骤集锦参考文献 Abstract PyTorch多卡并行运行程序is one of the mos…

西科大微机原理实验四(定时器程序设计)

任务一、 按实验要求内容新建一个ASM41.ASM文件,使用masm命令生成obj文件并输入 上述源程序中使用了外部资源,该外部资源存在于文件 LIB_TIM.OBJ中,因此使用link命令将 ASM41.OBJ 和 LIB_TIM.OBJ 一起链接生成可执行文件 使用debug加载程序并进行调试 使用-g指令,回显如下…

从零构建属于自己的GPT系列5:模型部署1(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

FPGA - 1、Simulink HDL coder模型例化到FPGA

Simulink HDL coder模型例化到FPGA 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右…

2024年程序员必备的五大Golang框架

Go语言&#xff0c;简称Golang&#xff0c;是由Google公司开发的一种编程语言&#xff0c;主要特点是简单、快速、安全和高效。在近年来&#xff0c;Golang的应用范围不断扩大&#xff0c;它的高效性和易于编写的特点在互联网领域广受欢迎。Golang在开发Web服务、网络编程、云计…

【正点原子STM32连载】第十三章 串口通信实验 摘自【正点原子】APM32E103最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32E103最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十…

前端页面显示的时间格式为:2022-03-18T01:46:08.000+00:00 如何转换为:年-月-日,并根据当前时间判断为几天前

由于后端每条博文的发表时间是以“xxxx—xx—xxxx:xx:xx”的形式显示的&#xff0c; 现在要在前端改成“xxxx年xx月xx日”的形式。 并对10分钟内发表的显示“刚刚”&#xff0c;对24小时内发表的显示“小时前”。 超过24小时&#xff0c;小于48小时&#xff0c;显示“1天前”。…