https://leetcode.com/problems/valid-perfect-square/
给定一个正整数num,判断它是不是一个完全平方数
一、问题分析
测试用例:
Input: 16
Output: true
Input: 14
Output: false
完全平方数为:0, 1, 4, 9, 16, ... 也就是平方根为整数的正整数
二、代码实现
class Solution {
public boolean isPerfectSquare(int num) {
//0、1都是完全平方数
if (num == 0 || num == 1) {
return true;
}
int left = 2, right = num;
while (left < right) {
int mid = left + (right - left) / 2;
//注意这里不能写成int square = mid * mid; 一些测试用例会溢出
long square = (long)mid * mid;
//System.out.println(square);
if (square == num) {
return true;
} else if (square < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
// left == right
if (left * left == num) {
return true;
}
return false;
}
}
改用除法防止溢出:
class Solution {
public boolean isPerfectSquare(int num){
if (num < 0) {
return false;
}
if (num == 0 || num == 1) {
return true;
}
int left = 2, right = num;
while (left <= right){
int mid = left + (right - left)/2;
//用除法可以避免溢出
if (mid > num / mid){
right = mid - 1;
} else if (mid < num / mid){
left = mid + 1;
} else {
return num % mid == 0;
}
}
return false;
}
}
其他值得参考的方法:
https://leetcode.com/problems/valid-perfect-square/discuss/83901/O(1)-Java-solution
https://leetcode.com/problems/valid-perfect-square/discuss/83969/Binary-search-solution-in-Python