Heyking

导航

 

有效的完全平方数

力扣链接: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

分析或原理

方法一:使用内置的库函数

根据完全平方数的性质,我们只需要直接判断num*num的平方根i是否为整数即可。

方法二:暴力遍历

从1 开始,从小到大遍历所有正整数,寻找是否存在满足i * i =num的正整数i。在遍历中,如果出现正整数i * i > num,则i的后面不可能再出现我们需要的值了。

方法三:二分查找

考虑使用二分查找来优化搜索过程。我们可以将 1num作为二分查找搜索区间的初始边界。

题解

解法一:

class Solution {
    // 使用Math.sqrt方法
    public boolean isPerfectSquare(int num) {
        // 使用内置方法直接求目标值的完全平方数
        int i = (int) Math.sqrt(num);
        // 判断i的平方是不是等于目标值并返回Boolean
        return i * i == num;
    }
}

解法二:

class Solution {
    // 暴力遍历
    public boolean isPerfectSquare(int num) {
        // 定义变量i从一开始递增,square存储i*i的值
        long i = 1, square = 1;
        // 循环出口就是i的平方值square超过了num就可以结束了
        while (square <= num) {
            // 如果找到的就直接返回ture
            if (square == num) {
                return true;
            }
            // 循环变化条件
            i++;
            // 求i的平方
            square = i * i;
        }
	   // 如果没有找到返回false
        return false;
    }
}

解法三:

class Solution {
    // 二分查找
    public boolean isPerfectSquare(int num) {
        // 定义左右边界
        int left = 0;
        int right = num;
        // 开始二分查找
        while(left <= right) {
            // 确定中间值
            int mid = (right - left) / 2 + left;
            // 计算中间值的平方存入square中
            long square = (long) mid * mid;
            // 比较square和目标值num的大小
            if(square > num) {  // 如果比目标值大右边界减一
                right = mid - 1;
            }else if(square < num) { // 如果比目标值小左边界等于mid+1
                left = mid + 1;
            }else {  // 否则就找到了
                return true;
            }
        }
        // 如果没找到就返回false
        return false;
    }
}

路漫漫其修远兮,吾将上下而求索。愿你永远保持对未来的热情和期望,不断追寻自己的梦想,成为自己想要成为的人。

posted on 2023-04-14 15:29  CTF小明  阅读(15)  评论(0编辑  收藏  举报