完全平方数

Posted Anomaly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完全平方数相关的知识,希望对你有一定的参考价值。

 

题目:

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

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

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

 来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/perfect-squares

方法一(常规方法):动态规划

 

状态转移方程:ƒ[i] = 1 +  [√i] min j=1  ƒ[i-j2]

 1 public int numSqu(int n){
 2     int [] f = new int [n+1];
 3     for (int i=1; i <=n;i++){
 4         int minn = Integer.MAX_VALUE;
 5         for(int j = 1; j * j <= i ; j++){
 6             minn = Math.min(minn,f[i - j * j]);
 7         }
 8         f[i] = minn + 1;
 9     }
10     return f[n];
11     }
12 }

 

方法二:用数学定理来简化

利用四平方和定理来快速筛选答案

当n≠4k x (8m+7)时,我们需要判断到底多少个完全平方数能够表示 n,我们知道答案只会是 1,2,3中的一个:

答案为 1 时,则必有 n 为完全平方数,这很好判断;

答案为 2 时,则有 n=a2+b2,我们只需要枚举所有的a(1≤a≤√n),判断 n-a2是否为完全平方数即可;

答案为 3 时,我们很难在一个优秀的时间复杂度内解决它,但我们只需要检查答案为 1或 2 的两种情况,即可利用排除法确定答案。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/perfect-squares/solution/wan-quan-ping-fang-shu-by-leetcode-solut-t99c/

 1 public int numSqu(int n){
 2     if (isPerSqu(n)){
 3         return 1;
 4     }
 5     if (checkAns4(n)){   
 6         return 4;
 7     }
 8     for (int i =1; i * i < n;i++){
 9         int j = n - i*i ;
10         if(isPerSqu(j)){
11             return 2;
12         }
13     }
14     return 3;
15 }
16 
17     public boolean isPerSqu(int x) {
18         int y = (int) Math.sqrt(x);
19         return y*y == x;
20     }
21 
22     public boolean checkAns4(int x){
23         while (x % 4 ==0) {
24             x /= 4;
25         }
26         return x % 8 == 7;
27     }

 

以上是关于完全平方数的主要内容,如果未能解决你的问题,请参考以下文章

大等于n的最小完全平方数

c语言程序:编写函数,判断一个正整数是不是为完全平方数,并输出100以内的完全平方数。

蓝桥杯每日一真题—— [蓝桥杯 2021 省 AB2] 完全平方数(数论,质因数分解)

BZOJ_2440_[中山市选2011]完全平方数_容斥原理+线性筛

Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

完全平方数