目录
问题描述
代码解决以及思想
知识点
问题描述
代码解决以及思想
class Solution {
public:
bool isPerfectSquare(int num) {
long int left = 0; // 定义左边界,使用 long int 以避免整数溢出
long int right = num; // 定义右边界,初始值取 num
while (left <= right) { // 当左边界小于或等于右边界时,执行循环
long int middle = left + (right - left) / 2; // 计算中间值,避免整数溢出
long int midSquare = middle * middle; // 计算中间值的平方
if (midSquare == num) { // 如果中间值的平方等于 num,表示找到了完全平方数
return true;
} else if (midSquare > num) { // 如果中间值的平方大于 num,目标在左半部分
right = middle - 1; // 更新右边界
} else { // 否则,目标在右半部分
left = middle + 1; // 更新左边界
}
}
return false; // 循环结束后,未找到完全平方数,返回 false
}
};
初始化左边界
left
为 0 和右边界right
为num
。进入一个循环,只要
left
不大于right
,执行以下操作:a. 计算中间值
middle
,通过(left + right) / 2
来避免整数溢出。b. 计算
middle
的平方midSquare
,即middle * middle
。c. 检查
midSquare
与num
的关系:
- 如果
midSquare
等于num
,表示找到了完全平方数,返回true
。- 如果
midSquare
大于num
,说明完全平方数在left
和middle
之间,将right
更新为middle - 1
。- 如果
midSquare
小于num
,说明完全平方数在middle
和right
之间,将left
更新为middle + 1
。循环结束后,如果找到完全平方数,就返回
true
,否则返回false
。这个算法充分利用了二分查找的思想,通过逐步缩小搜索范围来确定一个非负整数是否为完全平方数。如果是完全平方数,返回
true
,否则返回false
。这种方法可以高效地解决这一问题,避免了不必要的遍历。
我在做第一遍的时候,忘记考虑整数溢出的情况,所以应当定义为长整型
知识点
82.二分查找-CSDN博客
写在最后:以上就是本篇文章的内容了,感谢你的阅读。如果感到有所收获的话可以给博主点一个赞哦。如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~