题目描述

题目描述

给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。

进阶:不要 使用任何内置的库函数,如 sqrt 。

示例 1:

输入:num = 16
输出:true

示例 2:

输入:num = 14
输出:false

提示:

1 <= num <= 231 - 1

思路

暴力循环

从 1 开始,算平方到 num,如果有则 true,否则 false

  1. public boolean isPerfectSquare(int num) {
  2. for (int i = 0; i < num; i++) {
  3. if (Math.pow(i, 2) == num) {
  4. return true;
  5. }
  6. }
  7. return false;
  8. }

很自然,超时了

二分查找

image.png
367. 有效的完全平方数 - 图2

  1. public boolean isPerfectSquare(int num) {
  2. if (num < 2) {
  3. return true;
  4. }
  5. long left = 2, right = num / 2, x, guessSquared;
  6. while (left <= right) {
  7. x = left + (right - left) / 2;
  8. guessSquared = x * x;
  9. if (guessSquared == num) {
  10. return true;
  11. }
  12. if (guessSquared > num) {
  13. right = x - 1;
  14. } else {
  15. left = x + 1;
  16. }
  17. }
  18. return false;
  19. }
  • 时间复杂度:O(logN)
  • 空间复杂度:O(1)

牛顿迭代法(大概理解)

image.png
image.png

  1. public boolean isPerfectSquare(int num) {
  2. if (num < 2) return true;
  3. long x = num / 2;
  4. while (x * x > num) {
  5. x = (x + num / x) / 2;
  6. }
  7. return (x * x == num);
  8. }
  • 时间复杂度:O(logN)
  • 空间复杂度:O(1)

哔哔一下

牛顿迭代。。第一次听,长见识了