面试刷题第六天
LeetCode刷题——279. 完全平方数
1、题目描述
给你一个整数n,返回和为n的完全平方数的最少数量 。
完全平方数是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
2、解题思路
四平方和定理:任何一个数拆成平方数的项,不会超过4个。
规律解:
(1)规律一:个数不超过4。
(2)规律二:出现1个的时候,就是n开平方为整数。
(3)规律三:任何数消掉4的因子,结论不变。
(4)规律四:消掉4的因子后,若除8余7,一定是由4个组成。
Java代码如下:
class Solution {
public int numSquares(int n) {
//先消掉4的因子
while(n % 4 == 0){
n /= 4;
}
if(n % 8 == 7){
return 4;
}
for(int a=0; a*a<=n; ++a){
int b = (int) Math.sqrt(n -a*a);
if(a*a + b*b == n){
return (a>0 && b>0) ? 2 : 1;
}
}
return 3;
}
}