一、题目
给你一个整数 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个