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:

  1. 输入:16
  2. 输出:True

示例 2:

  1. 输入:14
  2. 输出:False

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-perfect-square

解题思路 1

php 不能使用 pow 函数,骚操作是 ** 0.5 这样的方式,自乘 0.5 次从 PHP5.6.0开始和根号效果一样。

代码
  1. class Solution {
  2. /**
  3. * @param Integer $num
  4. * @return Boolean
  5. */
  6. function isPerfectSquare($num) {
  7. return $num**0.5 == (int)($num**0.5);
  8. }
  9. }

解题思路 2

利用完全平方数的性质,完全平方数是一系列奇数之和,例如:

  1. 1 = 1
  2. 4 = 1 + 3
  3. 9 = 1 + 3 + 5
  4. 16 = 1 + 3 + 5 + 7
  5. 25 = 1 + 3 + 5 + 7 + 9
  6. 36 = 1 + 3 + 5 + 7 + 9 + 11
  7. ....
  8. 1+3+...+(2n-1) = (2n-1 + 1) n/2 = n* n

时间复杂度为 O(sqrt(n))。

代码
  1. class Solution {
  2. /**
  3. * @param Integer $num
  4. * @return Boolean
  5. */
  6. function isPerfectSquare($num) {
  7. $start = 1;
  8. while($num > 0)
  9. {
  10. $num -= $start; // 累减到最后是 0
  11. $start += 2; // 每次 +2 保持是连续奇数
  12. }
  13. return $num == 0;
  14. }
  15. }

解题思路3

二分查找

代码
  1. class Solution {
  2. /**
  3. * @param Integer $num
  4. * @return Boolean
  5. */
  6. function isPerfectSquare($num) {
  7. $left = 0;
  8. $right = $num;
  9. while($left < $right)
  10. {
  11. $mid = $right - floor(($right-$left)/2);
  12. if ($mid * $mid == $num) {
  13. return true;
  14. } elseif ($mid * $mid > $num) {
  15. $right = $mid - 1;
  16. } else {
  17. $left = $mid + 1;
  18. }
  19. }
  20. return $left * $left == $num;
  21. }
  22. }

参考链接: 平方数

最后恰饭 阿里云全系列产品/短信包特惠购买 中小企业上云最佳选择 阿里云内部优惠券