有效的完全平方数

题意:

给你一个正整数 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 <= 2^31 - 1

题目来源: https://leetcode.cn/problems/valid-perfect-square/description/

解题方法:

方法一:二分法

// 二分法
function isPerfectSquare($num) {
    if($num == 1){
        return true;
    }
    $mid = intval($num / 2);    //中间值
    $low = 1;   //最小值
    $high = $num;   //最大值
    while($low < $mid){
        if($mid * $mid == $num){    //存在有效的完全平方数,返回true
            return true;
        }else if($mid * $mid < $num){   //mid平方小于目标数,low后移,mid也随之变换到新的low和high之间
            $low = $mid;
            $mid = $low + intval(($high - $low) / 2);  
        }else{                          //mid平方大于目标数,high前移,mid也随之变换到新的low和high之间
            $high = $mid;
            $mid = $low + intval(($high - $low) / 2);
        }
    }
    return false;
}

//以9为例,可以看做是 [1,2,3,4,5,6,7,8,9]
//step1: mid = 4; low = 1; high = 9 || 4*4 > 9 || high = mid = 4; mid = 1 + intval((4 - 1) / 2) = 2
//step2: mid = 2; low = 1; high = 4 || 2*2 < 9 || low = mid = 2; mid = 2 + intval((4 - 2) / 2) = 3
//step3: mid = 3; low = 2; high = 4 || 3*3 = 9  return true

方法二:循环

//循环
function isPerfectSquare($num) {
    for($i = 1; $i <= $num; $i++){
        if($i * $i == $num){
            return true;
        }
        if($i * $i < $num && ($i + 1) * ($i + 1) > $num){   //如果相邻两个数前者的平方小于目标值,后者平方大于目标值,则满足题意
            return false;
        }
    }
}

你可能感兴趣的:(PHP,算法,php,数据结构)