Leetcode 367 有效的完全平方数
有效的完全平方数(Valid Perfect Square)
给定一个 正整数 num
,编写一个函数,如果 num
是一个完全平方数,则返回 true
,否则返回 false
。
进阶:不要 使用任何内置的库函数,如 sqrt
。
示例 1:
输入:num = 16
输出:true
示例 2:
输入:num = 14
输出:false
提示:
1 <= num <= 2^31 - 1
bool isPerfectSquare(int num){
for (int i = 0; i < 46341; ++i) {
if (i*i == num) return true;
if (i*i > num) return false;
}
return false;
}
暴力!因为46341的平方会超过整数的最大值,因此我们用46341,或者用long long 之类的
bool isPerfectSquare(int num){
long long d = 2;
long long s = 1;
while (s < num){
s += d + 1;
d += 2;
}
return s == num;
}
奇妙的代码,不过这样还是O(n^(1/2)) 的时间复杂度
bool rangedIsPerfectSquare(int left, int right, int target){
if (left > right) return false;
long long mid = left + (right - left)/2;
if (mid*mid == target) return true;
if (mid*mid < target) return rangedIsPerfectSquare(mid+1, right, target);
return rangedIsPerfectSquare(left, mid, target);
}
bool isPerfectSquare(int num){
return rangedIsPerfectSquare(1, INT_MAX, num);
}
优秀的时间复杂度 O(log n)