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  

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全域营销趋势下,品牌如何让流量变留量?

2023年已开始倒计时。 回望过去三年&#xff0c;社媒直播电商经历了从“野蛮生长”到“有序生长”的快速发展时期。 罗永浩的“真还传”、新东方向东方甄选的转型、董洁直播出圈翻红&#xff0c;命运的齿轮在不断转动&#xff0c;新的故事在不断抒写着。 伴随着头部达人的快速更…

【SpringBoot】配置文件

配置文件官网 1. 配置方式 application.propertiesapplication.yml / application.yaml 2. 自定义配置信息 将实体类中的本应该写死的信息写在属性配置文件中。 可以使用 Value("${键名}") 获取&#xff0c;也可以使用 ConfigurationProperties(prefix"前…

gitlab下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考&#xff1a; 1.下载 根据服务器操作系统版本&#xff0c;下载对应的RPM包。 gitlab官网&#xff1a; The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…

Spring上下文之注解模块ConfigurationMethod

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

管理类联考——英语二——考点+记忆篇——大作文——表格

大作文Remarkablechangesconcerning主题词havebeenwitnessedinTheabovechartthoroughlyrevealedthefascinatingissue.Onecanseethat年份1,事物1wasonly数字1.ButwithinashortdurationofXyears,事物1bumpedto数字2in年份2.Apartfromthat,事物2hasenjoyedaslightdeclineduringthe…

Python移动未标注的图片数据集

Python移动未标注的图片数据集 前言前提条件相关介绍实验环境Python移动未标注的图片数据集情况一&#xff1a;有图&#xff0c;无标注文件代码实现输出结果 情况二&#xff1a;有图&#xff0c;有标注文件&#xff0c;但标注信息为空代码实现输出结果 情况一与情况二同时都考虑…

c++ 中多线程的相关概念与多线程类的使用

1、多线程相关概念 1.1 并发、并行、串行 并发&#xff08;Concurrent&#xff09;&#xff1a;并发是指两个或多个事件在同一时间间隔内运行。在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机…

gRPC框架

1、gRPC 与 Protobuf 介绍 微服务架构中&#xff0c;由于每个服务对应的代码库是独立运行的&#xff0c;无法直接调用&#xff0c;彼此间 的通信就是个大问题gRPC 可以实现微服务&#xff0c; 将大的项目拆分为多个小且独立的业务模块&#xff0c; 也就是服务&#xff0c; 各服…

根文件系统(一):基础

本文主要探讨210根文件系统相关知识。 根文件系统 存储设备(flash等)是分块(扇区),访问存储设备是按块号 (扇区号)来访问,文件系统(软件)对存储设备扇区进行管理,将对扇区的访问变成对目录和文件名的访问 根文件系统init进程的应用程序和其他应用程序,提供根目…

6年级学生C++零基础,学过Scratch少儿编程,学习CSP-J的年度计划表

我是一个6年级学生C零基础&#xff0c;只学过一些Scratch少儿编程知识&#xff0c;准备明年参加信息学奥赛的CSP-J比赛&#xff0c;请为我写个学习计划&#xff0c;以下是一个针对学生的情况制定的学习计划&#xff1a; **学习目标&#xff1a;** 1. 掌握C编程语言的基本语法和…

应对.mkp勒索病毒:专业咨询和恢复数据的有效方案

导言&#xff1a; 一种新型的恶意软件威胁——.mkp勒索病毒&#xff0c;以其毒瘤般的加密技术带来了巨大的数据安全风险。本文将深入介绍.mkp勒索病毒的特性、应对策略&#xff0c;以及如何通过强有力的预防措施将其风险降至最低。如果您正在经历勒索病毒的困境&#xff0c;欢…

Linux服务器开发太麻烦? 试试IntelliJ IDEA公网远程访问开发极大提升开发效率

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