首页 > 代码库 > Perfect Squares
Perfect Squares
方法一: 动态规划
https://segmentfault.com/a/1190000003768736
https://siddontang.gitbooks.io/leetcode-solution/content/dynamic_programming/perfect_squares.html
复杂度
时间 O(N^2) 空间 O(N)
思路
如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a+bxb,那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。
public class Solution { /** * @param n a positive integer * @return an integer */ public int numSquares(int n) { // Write your code here int[] dp = new int[n + 1]; // 将所有非平方数的结果置最大,保证之后比较的时候不被选中 Arrays.fill(dp, Integer.MAX_VALUE); // 将所有平方数的结果置1 for (int i = 0; i * i <= n; i++) { dp[i * i] = 1; } // 从小到大找任意数a for (int i = 0; i <= n; i++) { // 从小到大找平方数bxb for (int j = 1; i + j * j <= n; j++) { // 因为a+b*b可能本身就是平方数,所以我们要取两个中较小的 dp[i + j * j] = Math.min(dp[i] + 1, dp[i + j * j]); } } return dp[n]; } }
方法二:
数学 四平方和定理
https://www.cnblogs.com/grandyang/p/4800552.html
动态规划
复杂度
时间 O(N^2) 空间 O(N)
思路
如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a+bxb,那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。
Perfect Squares
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。