题解 | #完全平方数的草料# java
完全平方数的草料
https://www.nowcoder.com/practice/0d467680d82046db866cf89beb861144
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @return int整型一维数组 */ public int[] numSquares (int n) { // write code here int[] dp = new int[n + 1]; Arrays.fill(dp, Integer.MAX_VALUE); dp[0] = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j * j <= i; j++) { dp[i] = Math.min(dp[i], dp[i - j * j] + 1); } } int[] ans = new int[dp[n]]; int index = ans.length - 1; while (n > 0) { for (int i = (int) Math.sqrt(n); i >= 1; i--) { if (dp[n - i * i] + 1 == dp[n] && n >= i * i) { ans[index] = i * i; index--; n -= i * i; break; } } } return ans; } }
这段代码使用的是Java编程语言。
该代码考察了动态规划问题,求将正整数n表示为完全平方数之和的最小个数,并返回应组成的完全平方数数组。
代码的详细解释如下:
- 创建一个名为
Solution
的类,其中声明了一个名为numSquares
的方法,该方法接受一个整型参数n
,并返回一个整型数组。 - 创建一个长度为
n+1
的整型数组dp
,并用Integer.MAX_VALUE
填充数组中的所有元素。dp[i]
表示将数字i
表示为完全平方数的最小个数。 - 将
dp[0]
初始化为0,表示将数字0表示为完全平方数的个数为0。 - 使用两层循环,外层循环遍历从1到n的每个数,内层循环遍历从1到
i
的平方根的每个数,计算将数字i
表示为完全平方数的最小个数。 - 在内层循环中,通过比较
dp[i - j * j] + 1
和当前dp[i]
的值,更新dp[i]
为两者中的较小值。其中j * j
表示一个完全平方数。 - 循环结束后,
dp[n]
即为将数字n
表示为完全平方数的最小个数。 - 创建一个长度为
dp[n]
的整型数组ans
,用于存储表示n
的完全平方数。 - 从
ans
数组的最后一个位置开始,通过遍历n
和平方根取整之间的完全平方数,判断是否可以将n
减去一个完全平方数,使得剩余的数可以表示为更少的完全平方数。 - 如果可以找到这样的完全平方数,将其存入
ans
数组,并将n
更新为n - i * i
。 - 对
ans
数组进行排序并返回作为结果。
该代码使用动态规划的思路,先计算将每个数字表示为完全平方数的最小个数,然后通过倒推的方式得到具体的完全平方数组合。最后返回的数组即为表示n
的完全平方数。