279. Perfect Squares


Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

题目含义:求一个数字可以通过最少个平方数累加得到

 1     /* 如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x = a + bxb,
 2     * 那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。
 3     */    
 4     public int numSquares(int n) {
 5         int[] nums = new int[n + 1];
 6         Arrays.fill(nums, Integer.MAX_VALUE); // 将所有非平方数的结果置最大,保证之后比较的时候不被选中
 7         for (int i = 0; i * i <= n; i++)  // 将所有整平方数的结果置1
 8         {
 9             nums[i * i] = 1;
10         }
11         for (int a = 0; a <= n; a++)// 从小到大找任意数a
12             for (int b = 0; a + b * b <= n; b++)// 从小到大找平方数b*b
13             {
14                 nums[a + b * b] = Math.min(nums[a] + 1, nums[a + b * b]);// 因为a+b*b可能本身就是平方数,所以我们要取两个中较小的
15             }
16         return nums[n];        
17     }
原文地址:https://www.cnblogs.com/wzj4858/p/7692688.html