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 }