layout: posttitle: PHP 计算有效的完全平方数
subtitle: PHP 计算有效的完全平方数
date: 2020-08-09
author: he xiaodong
header-img: img/default-post-bg.jpg
catalog: true
tags:
- Go
- PHP
- LeetCode
- 有效平方数
有效的完全平方数
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16输出:True
示例 2:
输入:14输出:False
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-perfect-square
解题思路 1
php 不能使用 pow 函数,骚操作是 ** 0.5 这样的方式,自乘 0.5 次从 PHP5.6.0开始和根号效果一样。
代码
class Solution {/*** @param Integer $num* @return Boolean*/function isPerfectSquare($num) {return $num**0.5 == (int)($num**0.5);}}
解题思路 2
利用完全平方数的性质,完全平方数是一系列奇数之和,例如:
1 = 14 = 1 + 39 = 1 + 3 + 516 = 1 + 3 + 5 + 725 = 1 + 3 + 5 + 7 + 936 = 1 + 3 + 5 + 7 + 9 + 11....1+3+...+(2n-1) = (2n-1 + 1) n/2 = n* n
时间复杂度为 O(sqrt(n))。
代码
class Solution {/*** @param Integer $num* @return Boolean*/function isPerfectSquare($num) {$start = 1;while($num > 0){$num -= $start; // 累减到最后是 0$start += 2; // 每次 +2 保持是连续奇数}return $num == 0;}}
解题思路3
二分查找
代码
class Solution {/*** @param Integer $num* @return Boolean*/function isPerfectSquare($num) {$left = 0;$right = $num;while($left < $right){$mid = $right - floor(($right-$left)/2);if ($mid * $mid == $num) {return true;} elseif ($mid * $mid > $num) {$right = $mid - 1;} else {$left = $mid + 1;}}return $left * $left == $num;}}
参考链接: 平方数
