当前位置: 首页 > backend >正文

专题三_二分_x 的平方根

一:题目

解释:返回x的算数平方根,如果是小数,则舍去小数部分,返回整数即可!

二:算法

①:暴力

从1开始求平方,最后要么直接找到一个值的平方为x,要么发现x在两个相邻的数的平方之间

暴力的时间复杂度为O(N)

但是我们从暴力得知,最后返回的一定是left,因为双指针相遇返回left和right都可以,但是如果发现x是两个相邻的数的平方之间,则返回left,因为题目要求向下取整

②:二分

做过了上道题目,此题简直如鱼得水!

我们将数组划分为两个部分,左部分值的平方<=x,右部分值的平方>x,本质是因为数组有可能没有直接平方等于x的值,所以左部分是<=

其次我们的区间的范围直接从1~x开始即可,因为只要一个数是正整数,则其一定小于其的平方!

所以:

mid*mid <=x 则left=mid  //落入左部分

mid*mid >x 则right=mid-1 //落入右部分

很显然,我们的求中点的式子必须为:mid = left + (right - left + 1) / 2!

因为,我们说过mid不能落在原地踏步的指针上,此题left=mid,所以不能落在left上,所以我们选择该式子,当只有两个元素的时候,mid会落在right指针上

其次循环的条件必定是left<right,避免双指针相遇再次进入循环,导致原地踏步死循环!

三:代码

class Solution {
public:int mySqrt(int x) {if (x < 1) return 0;int left = 1, right = x;while (left < right) {long long mid = left + (right - left + 1) / 2;//long long 防溢出if (mid * mid <= x) left = mid;else right = mid - 1;}return left;}
};

解释:

1:循环条件,left<right

2:求中点式子,mid = left + (right - left + 1) / 2; 

3:返回的是left

4:x可能为0~1之间,所以一开始特判即可

http://www.xdnf.cn/news/17902.html

相关文章:

  • Linux软件编程(五)(exec 函数族、system、线程)
  • 【Go语言-Day 36】构建专业命令行工具:`flag` 包入门与实战
  • Struts文件泄露漏洞分析与修复方案
  • Swift 实战:用最长递增子序列算法解“俄罗斯套娃信封”问题(LeetCode 354)
  • Unity 实现逼真书本翻页效果
  • Vue响应式系统在超大型应用中的性能瓶颈
  • 深入浅出的 RocketMQ-面试题解析
  • 力扣hot100 | 普通数组 | 53. 最大子数组和、56. 合并区间、189. 轮转数组、238. 除自身以外数组的乘积、41. 缺失的第一个正数
  • LeetCode 面试经典 150_数组/字符串_最长公共前缀(20_14_C++_简单)(暴力破解)(求交集)
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘fairseq’问题
  • 关于Manus AI与多语言手写识别的技术
  • 学习笔记与效率提升指南:编程、记忆与面试备考
  • 中级统计师-会计学基础知识-第一章 账户与复试记账
  • diffusers学习--stable diffusion的管线解析
  • Cursor 分析 bug 记录
  • 楼宇自控系统是智能建筑核心,其重要地位日益凸显
  • C++面试——内存
  • Flutter 自定义组件开发指南
  • Spark03-RDD01-简介+常用的Transformation算子
  • 让数据可视化更简单:Embedding Atlas使用指南
  • initdata段使用方式
  • 第454题.四数相加II
  • Ant-Design AUpload如何显示缩略图;自定义哪些类型的数据可以使用img预览
  • 如何下载低版本的NVIDIA显卡驱动
  • Pytest项目_day17(随机测试数据)
  • 【LeetCode 热题 100】45. 跳跃游戏 II
  • 杭州网站建设:如何展示企业科研实力?
  • GitCode疑难问题诊疗
  • 状态流程框架(cola-component-statemachine)
  • 正点原子STM32H743配置 SDRAM