给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/queue-stack/kfgtt/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码一
queue实现的BFS算法
class Solution {
public int numSquares(int n) {
Queue<Integer> queue = new LinkedList<>();
Set<Integer> set = new HashSet<>();
queue.offer(0);
set.add(0);
int level = 0;
while(!queue.isEmpty()){
int size = queue.size();
level++;
for(int i = 0;i<size;i++){
int e = queue.poll();
for(int j = 1;j<n;j++){
int val = e+j*j;
if(val==n){
return level;
}
if(val>n){
break;
}
if(!set.contains(val)){
queue.offer(val);
set.add(val);
}
}
}
}
return level;
}
}
核心是BFS的应用:
public void levelOrder(TreeNode tree) {
Queue<TreeNode> queue = new LinkedList<>();
queue.add(tree);
int level = 0;//统计有多少层
while (!queue.isEmpty()) {
//每一层的节点数
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
//打印节点
System.out.println(node.val);
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
}
level++;
//打印第几层
System.out.println(level);
}
}
作者:数据结构和算法
链接:https://leetcode-cn.com/leetbook/read/queue-stack/kfgtt/?discussion=xgcYsh
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码二
线性规划
递归方程:
dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
class Solution {
public int numSquares(int n) {
int[] dp = new int[n+1];
dp[0] = 0;
for(int i = 1;i<=n;i++){
dp[i] = i;
for(int j = 1;j*j<=i;j++){
dp[i] = Math.min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
}
代码三
「四平方和定理」了解就好,这种用定理解题真没意思
四平方和定理证明了任意一个正整数都可以被表示为至多四个正整数的平方和。
class Solution {
public int numSquares(int n) {
if (isPerfectSquare(n)) {
return 1;
}
if (checkAnswer4(n)) {
return 4;
}
for (int i = 1; i * i <= n; i++) {
int j = n - i * i;
if (isPerfectSquare(j)) {
return 2;
}
}
return 3;
}
// 判断是否为完全平方数
public boolean isPerfectSquare(int x) {
int y = (int) Math.sqrt(x);
return y * y == x;
}
// 判断是否能表示为 4^k*(8m+7)
public boolean checkAnswer4(int x) {
while (x % 4 == 0) {
x /= 4;
}
return x % 8 == 7;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/perfect-squares/solution/wan-quan-ping-fang-shu-by-leetcode-solut-t99c/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。