1.题目

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

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

示例:

  1. 输入:num = 16
  2. 输出:true
  3. 输入:num = 14
  4. 输出:false

提示:

  • 367. 有效的完全平方数 - 图1

2.思路

首先我们要知道什么是完全平方数:完全平方指用一个整数乘以自己例如367. 有效的完全平方数 - 图2367. 有效的完全平方数 - 图3367. 有效的完全平方数 - 图4等,依此类推。若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。

转换一下意思,也就是要找一个数x使得367. 有效的完全平方数 - 图5,也就是367. 有效的完全平方数 - 图6

暴力法:

  1. public boolean isPerfectSquare(int num) {
  2. //解法一:暴力循环
  3. double i = 1;
  4. while(i * i < num){
  5. i++;
  6. }
  7. return i * i == num;
  8. }

对于这种单调函数,我们也可以使用二分法:

  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. }

根据公式:367. 有效的完全平方数 - 图7%3Dn%5E2#card=math&code=1%2B3%2B5%2B%5Ccdots%2B%282n-1%29%3Dn%5E2&id=Pkd1U),可得:

  1. public boolean isPerfectSquare(int num) {
  2. int i = 1;
  3. while(num > 0) {
  4. num -= i;
  5. i += 2;
  6. }
  7. return num == 0;
  8. }

牛顿迭代法(看不懂,救救我o(╥﹏╥)o):

  1. public boolean isPerfectSquare(int num) {
  2. if(1 == num) return true;
  3. int i = num / 2;
  4. while((double)i * i > num){
  5. i = (i + num / i) / 2;
  6. }
  7. return i * i == num;
  8. }