刷题笔记-367. 有效的完全平方数

119 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

一、题目描述:

367. 有效的完全平方数 - 力扣(LeetCode)

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

进阶:

不要 使用任何内置的库函数,如  sqrt

 

示例 1:

输入:num = 16
输出:true

示例 2:

输入:num = 14
输出:false

提示:

  • 1 <= num <= 2^31 - 1

二、思路分析:

先根据个位数排除不是完全平方数的数 数列An的通项公式是A1=k(大于0的常量),An=(num / An-1 + An-1)/ 2 则当n趋向于无穷大时,An的极限是num的平方根 得到num平方根root的整数部分之后, 通过对比num的个位数是否与root平方的个位数相等来判断是否是完全平方数

三、AC 代码:

class Solution {
    public boolean isPerfectSquare(int num) {
        int judge = num % 10;
		//个位数不能是2,3,7,8
		if (judge == 2 || judge == 3 || judge == 7 || judge == 8)
			return false;
		int resultDigit = ((int) sqrtByRecursive(num)) % 10;
		return judge == resultDigit * resultDigit % 10;
    }
    public double sqrtByRecursive(double num) {
		double result = 1;
		for (int i = 0; i < 100; i++) {
			result = (num / result + result) / 2;
		}
		return result;
	}
}

四、总结:

官方还发了一种牛顿迭代法,学习了。

定义左边界为0.右边界为num / 2 + 1
当左边界小于等于右边界的时候,进循环
定义中间数为左加右除以2
如果中间数的平方为num,返回true
如果大于,则令右边界+1
如果小于,则令左边界+1

五、参考:

就是来回计算一下,比较原值,挺好理解的,不算最糟糕的-_-|| - 有效的完全平方数 - 力扣(LeetCode)

就是来回计算一下,比较原值,挺好理解的,不算最糟糕的-_-|| - 有效的完全平方数 - 力扣(LeetCode)

二分法,中间夹杂基本的类型转换,其实牛顿迭代法,也有二分法的影子 - 有效的完全平方数 - 力扣(LeetCode)