1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| 思路: 使用二分法查找,直至左右两边相等或左边大于右边
代码: /** * @param Integer $num * * @return Boolean */ function isPerfectSquare($num) { $left = 0; $right = $num; while ($left <= $right) { // 取中间值 $mid = intdiv($left + $right, 2);
if ($mid * $mid > $num) { // 过大,说明在右边,mid-1,防止出现left和right相差1的死循环情况 $right = $mid - 1; } elseif ($mid * $mid < $num) { // 过小,说明在左边,mid+1,防止出现left和right相差1的死循环情况 $left = $mid + 1; } else { return true; } }
return false; }
|