367. Valid Perfect Square
Given a positive integer
num, write a function which returns True if
num is a perfect square else False.
Note:
Do not use any built-in library function such as
sqrt
.
Example 1:
Input: 16 Returns: True
Example 2:
Input: 14 Returns: False
方法一、源自于数学方法,时间复杂度为O(sqrt(num)) 证明: 1 = 1 4 = 1 + 3 9 = 1 + 3 + 5 16 = 1 + 3 + 5 + 7 ...... 1+3+.....(2n-1)=n/2*(2n-1+1)=n*n 代码:bool isPerfectSquare(int num) { //时间复杂度为O(sprt(num)) int i=1; while(num>0) { num-=i; i+=2; } return num==0; }
方法二、二分查找法,时间复杂度为:O(lgn) 代码:bool isPerfectSquare(int num) { //时间复杂度为O(lg(num)) int low = 1; int high = num; while(low <= high) { long mid = (low + high) / 2; if(mid * mid == num) return true; else if(mid * mid < num) low = (int)mid + 1; else high = (int)mid - 1; } return false; }
方法三、牛顿法 牛顿法详细描述见:http://blog.youkuaiyun.com/wangxiaojun911/article/details/18203333
bool isPerfectSquare(int num) {
long x = num; while (x * x > num) { x = (x + num / x) >> 1; } return x * x == num; }