【LeetCode】完全平方数 [M](数学)

166 篇文章 0 订阅

279. 完全平方数 - 力扣(LeetCode)

一、题目

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12

输出:3 
解释:12 = 4 + 4 + 4

示例 2:​​​​​​​

输入:n = 13

输出:2
解释:13 = 4 + 9

提示:

  • 1 <= n <= 104

二、代码

class Solution {
    public int numSquares(int n) {
        int rest = n;
		// 规律四
		while (rest % 4 == 0) {
			rest /= 4;
		}
		// 规律三和规律四
		if (rest % 8 == 7) {
			return 4;
		}
		// 规律二
		int f = (int) Math.sqrt(n);
		if (f * f == n) {
			return 1;
		}
		// 执行到这里,就排除了1个和4个的情况
		// 先去判断是不是2个,就尝试所有可能的左部分,进而再去验证剩余的右部分是不是完全平方数,找到了一种可行的方案就说明是2个
		// first:尝试其中的一个平方数为first * first
		for (int first = 1; first * first <= n; first++) {
			// 将剩余的数(n - first * first)开平方
			int second = (int) Math.sqrt(n - first * first);
			// 看两部分数first * first和second * second加和是否能得到n,能得到就说明由2个完全平方数组成,返回2
			if (first * first + second * second == n) {
				return 2;
			}
		}
		// 如果执行到这里,就只剩下3个的情况了,直接返回3
		return 3;
    }
}

三、解题思路 

四平方和定理:

规律一:个数不超过4

规律二:如果这个数可以直接开平方,那么就直接返回1个

规律三:任何数 % 8 == 7,那么一定是4个

规律四:任何数消去4的因子之后,剩下rest,如果rest % 8 == 7,那么一定是4个

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值