完全平方数
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 }
以上是关于完全平方数的主要内容,如果未能解决你的问题,请参考以下文章
c语言程序:编写函数,判断一个正整数是不是为完全平方数,并输出100以内的完全平方数。
蓝桥杯每日一真题—— [蓝桥杯 2021 省 AB2] 完全平方数(数论,质因数分解)
BZOJ_2440_[中山市选2011]完全平方数_容斥原理+线性筛