本文主要是介绍367.有效的完全平方数(力扣LeetCode),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
367.有效的完全平方数
题目描述
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt 。
示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
提示:
- 1 <= num <= 231 - 1
浮点数二分
因为在二分查找结束后,r 保存了逼近的平方根值,所以r*r要强制类型转换为int类型
// 定义解决问题的类 Solution
class Solution {
public:// 判断正整数 num 是否为完全平方数的函数bool isPerfectSquare(int num) {// 设置二分查找的范围,从0到numdouble l = 0, r = num;// 使用二分查找来逼近平方根的值// 当左右边界的差距小于1e-6时停止查找// 这里的1e-6是一个小的阈值,用于控制查找精度while (r - l >= 1e-6) {// 计算中点值double mid = (r + l) / 2;// 如果 mid 的平方大于或等于 num,更新右边界 rif (mid * mid >= num) r = mid;// 否则,更新左边界 lelse l = mid;}// 如何判断一个数是完全平方数?// 一个数如果是完全平方数,其平方根一定是整数。// 在二分查找结束后,r 保存了逼近的平方根值,// 将其强制转换成整数然后再平方,看是否等于原始数值 num。// 如果相等则表示 num 是完全平方数,返回 true// 否则表示 num 不是完全平方数,返回 falseif ((int)r * (int)r == num) return true;return false;}
};
整数二分
因为当 mid 为 46341 或更大时,mid * mid 的结果会超过 int 类型能表示的最大值,从而导致溢出,所以需要long long来防止溢出
// 定义解决问题的类 Solution
class Solution {
public:// 函数用来判断 num 是否为完全平方数bool isPerfectSquare(int num) {// 使用 long long 类型来避免在计算过程中可能出现的整数溢出long long l = 0;long long r = num;// 使用二分查找算法来确定是否存在整数 n 使得 n*n == numwhile (l < r) {// 计算中间值,注意这里为了运算符优先级,先进行加法操作,再进行右移一位操作以除以2// 右移运算符具有比加法更高的优先级,所以必须确保加法在右移之前执行long long mid = (r + l) >> 1;// 如果 mid 的平方大于或等于 num,那么需要在左侧区间 [l, mid] 中继续查找if (mid * mid >= num) {r = mid;} // 如果 mid 的平方小于 num,那么需要在右侧区间 [mid+1, r] 中继续查找else {l = mid + 1;}}// 经过上面的循环,如果 num 是完全平方数,则 l (或 r) 将等于 num 的平方根// 检查 l 的平方是否等于 num 来确定 num 是否为完全平方数if (l * l == num) return true;// 如果 l 的平方不等于 num,则说明 num 不是完全平方数return false;}
};
这篇关于367.有效的完全平方数(力扣LeetCode)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!