leetcode:69. x 的平方根

一、题目

**函数原型:**int mySqrt(int x)
二、思路

利用二分查找思想,在0与x区间进行查找。

设置左边界 left (初始值为0),右边界 right(初始值为x)和中值 mid (值为区间的中间值),同时设置一个ans(初始值为-1)作为最终返回值。

设置循环,循环条件为 left<=right。每次进入循环,通过中值mid的平方与x进行比较确定x的平方根在中值左区间还是右区间或是mid即为x的平方根。mid平方小于x则说明平方根在中值左区间,大于x则说明平方根在中值右区间。

每次进入循环,先更新一下mid的值,然后再进行比较判断确定平方根所在区间。将平方根在左区间和平方根刚好等于mid的情况合并。如果平方根在左区间或平方根刚好等于mid,则更新区间并将mid的值赋值给ans;如果平方根在右区间,则只更新区间。

最终循环结束后,返回ans。

关键1:中值mid值如何求?

mid = left +(right - left)/ 2

关键2:为什么循环条件是 left<=right ?

只有当left <= right 时,才能保证要求的平方根在区间内。left = right 时也算一个区间,只不过该区间只有一个值。

关键3:为什么只有当mid的平方小于等于x时才将mid的值赋给ans?

当mid的平方等于x时,将mid的值赋给ans毋庸置疑。当mid的平方小于x时,将mid的值赋给ans,是因为在循环中可能会出现所求平方根的精确值在两个相邻整数之间,此时mid的值时较小的整数,我们要求的粗略值也是较小的整数,因此mid的值就是我们要求的ans值。

关键4:为什么mid的平方需要强制类型转换?

因为题目提示部分显示x<=2^31-1,数据较大,int类型可能能存放不下,需要用long long类型存储。

cpp 复制代码
int mySqrt(int x) 
{
	int left = 0;
	int right = x;
	int mid = left + (right - left) / 2;
	int ans = -1;

	while (left <= right)
	{
		mid = left + (right - left) / 2;
		if ((long long)mid * mid <= x )
		{
			left = mid + 1;
			ans = mid;
		}
		else if ((long long)mid * mid > x )
		{
			right = mid - 1;
		}
	}
	return ans;
}
相关推荐
梭七y15 分钟前
【力扣hot100题】(103)移动零
数据结构·算法·leetcode
weixin_4130632134 分钟前
测试《A Simple Algorithm for Fitting a Gaussian Function》拟合
python·算法
MarkHD44 分钟前
智能体在车联网中的应用:第31天 基于RLlib的多智能体PPO实战:MAPPO算法解决simple_spread合作任务
算法
IT猿手1 小时前
三维动态避障路径规划:基于部落竞争与成员合作算法(CTCM)融合动态窗口法DWA的无人机三维动态避障方法研究,MATLAB代码
算法·matlab·动态规划·无人机·路径规划·动态路径规划
wadesir1 小时前
Java实现遗传算法(从零开始掌握智能优化算法)
java·开发语言·算法
Jeremy爱编码1 小时前
leetcode热题腐烂的橘子
算法·leetcode·职场和发展
H CHY1 小时前
C++代码
c语言·开发语言·数据结构·c++·算法·青少年编程
alphaTao1 小时前
LeetCode 每日一题 2025/12/22-2025/12/28
算法·leetcode
xiaolang_8616_wjl1 小时前
c++题目_传桶(改编于atcoder(题目:Heavy Buckets))
数据结构·c++·算法
中國龍在廣州2 小时前
生成不遗忘,「超长时序」世界模型,北大EgoLCD长短时记忆加持
人工智能·深度学习·算法·自然语言处理·chatgpt