有效的完全平方数--LeetCode
题目
给你一个正整数num。如果num是一个完全平方数,则返回true,否则返回false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如sqrt。
示例 1:
- 输入:num=16
- 输出:true
- 解释:返回 true因为4*4=16 且4是一个整数。
示例 2:
- 输入:num = 14
- 输出:false
- 解释:返回false,因为3.742*3.742=14但3.742不是一个整数。
解题思路
- 初始化边界和标记变量:
由于一个数num
的平方根肯定在0
到num
这个范围内,所以初始化二分查找的左边界left
为0
,右边界right
为num
。同时初始化一个布尔变量flash
来标记是否找到完全平方数,初始值设为false
。 - 二分查找过程:
在while
循环中,只要左边界left
小于等于右边界right
,就计算中间位置mid
。- 如果
mid
的平方(转换为long
类型防止溢出)小于num
,说明完全平方数在mid
的右侧,将左边界left
更新为mid + 1
,继续向右查找。 - 如果
mid
的平方大于num
,说明完全平方数在mid
的左侧,将右边界right
更新为mid - 1
,继续向左查找。 - 如果
mid
的平方等于num
,说明找到了完全平方数,将flash
标记为true
,并为了让循环结束,将左边界left
更新为mid + 1
。
- 如果
- 返回结果:
当循环结束时,根据flash
的值返回结果。如果flash
为true
,说明找到了完全平方数,返回true
;否则返回false
。
class Solution {public boolean isPerfectSquare(int num) {int left = 0;int right = num;boolean flash = false;while (left <= right) {int mid = (left + right) / 2;if ((long)mid * mid < num) {// 将 mid 转换为 long 类型后计算平方,因为当 mid 较大时,int 类型相乘可能会溢出// 如果 mid 的平方小于 num,说明完全平方数在 mid 的右侧left = mid + 1;// 所以将左边界更新为 mid + 1,继续向右查找} else if ((long)mid * mid > num) {// 如果 mid 的平方大于 num,说明完全平方数在 mid 的左侧right = mid - 1;// 因此将右边界更新为 mid - 1,继续向左查找} else {// 如果 mid 的平方等于 num,说明找到了完全平方数flash = true;left = mid + 1;// 为了让循环继续结束(因为已经找到答案,这里更新左边界只是为了让循环条件不满足从而退出),将左边界更新为 mid + 1}}return flash;}
}