二分查找day3
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例 :
输入:num = 16
输出:true
class Solution {
public:
bool isPerfectSquare(int num) {
int left=1;
int right=num;
int mid;
long ll;
while(left<=right)
{
mid=left+(right-left)/2;
ll=(long)mid*mid;
if(ll>num)
{
right=mid-1;
}
if(ll<num)
{
left=mid+1;
}
if(ll==num)
return true;
}
return false;
}
};
二分查找已是非常套路化的代码和思想,有以下几点需要注意:
- 用mid=left+(right-left)/2 比直接mid=(left+right)/2 更好,能避免溢出。
- 当数字过大时,用long型
- 特别注意有些地方的left和right,是需要加减1的。在本题中,我一开始写的时候按照以往套路没在left后加一,程序运行时间过长。