持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
一、题目描述:
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:
不要 使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
示例 2:
输入:num = 14
输出:false
提示:
- 1 <= num <= 2^31 - 1
二、思路分析:
首先采用的思想是二分法,不会自己去看思想
关键之处在于判断语句如何理解?
对middle>num/middle 意思是middle的平方必然是大于num有足够余数
而middle<num/middle 意思是middle的平方必然是小于num有余数
中间一些情况,即使middle的平方不等于num,仍存在middle==num/middle,例如2==5/2;
这种情况的原因是num大于middle,且余数不够middle(num%middle!=0),属于num大于middle范围内;
三、AC 代码:
class Solution {
public:
bool isPerfectSquare(int num) {
if(num==1) return true;
int left=0,right=num,middle;
while(left<=right){
middle=left+(right-left)/2;
if(middle>num/middle) right=middle-1;
else if(middle<num/middle || num%middle!=0) left=middle+1;
else return true;
}
return false;
}
};
四、总结:
该题与本站 69. x 的平方根 类似
等价于判断是否存在一个整数 x ,使得 x * x == num
使用二分查找,看能否找到这样的整数 x
查找成功,返回true
查找失败,返回false
五、参考:
执行用时 : 0 ms , 在所有 C++ 提交中击败了 100.00% 的用户 - 有效的完全平方数 - 力扣(LeetCode)
【C/C++】367. 有效的完全平方数 题解:经典二分的变形使用 - 有效的完全平方数 - 力扣(LeetCode)
Jhong | 367. 有效的完全平方数,注意溢出的坑就行 - 有效的完全平方数 - 力扣(LeetCode)
[Alton]-Binary Search / Newton's method + 有效的完全平方数 - 有效的完全平方数 - 力扣(LeetCode)