码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] 279. Perfect Squares

时间:2020-06-28 09:27:41      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:java   动态   一个   组成   find   func   asc   需要   logs   

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

Example 1:

Input: n = 12
Output: 3 
Explanation: 12 = 4 + 4 + 4.

Example 2:

Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.

完全平方数。题意是给一个数字N,请你返回最少的需要几个完全平方数的加和的个数。比如第一个例子,12是由三个4组成,4也是完全平方数。

思路是动态规划。首先说一下暴力解,这个题的暴力解是从1到N一个个看是否是完全平方数,如果N是某个数的平方,那么结果自然等于2;如果N不是某个数的平方,那么可以试着从1开始,用N减去每个数的平方,看看需要几个完全平方数才能得到N。举个例子,比如找15好了,第一个完全平方数是1,需要15个1;第二个完全平方数是4,需要3个4 + 3个1。

其实动态规划的思路是从暴力解延伸出来的,只是我们用了一个额外的数组记录了之前的结果。首先创建一个长度为N + 1的数组记录DP的结果,并且DP[0] = 1。从i= 1开始,一直遍历到N。当遇到一个新的数字N的时候,需要再次从1开始遍历,看看当前的这个数字i是否整体或者部分能被某一个更小的数的平方代替。比如遍历到7的时候,我们发现7是可以被一个2的平方和三个1的平方代替的,所以DP的转移方程是

dp[i] = Math.min(dp[i], dp[i - j * j] + 1);

这里j的范围是[1, i)

最后返回的是dp[n]

时间O(n * sqrt(n))

空间O(n)

Java实现

 1 class Solution {
 2     public int numSquares(int n) {
 3         int[] res = new int[n + 1];
 4         Arrays.fill(res, Integer.MAX_VALUE);
 5         res[0] = 0;
 6         for (int i = 0; i <= n; i++) {
 7             for (int j = 1; j * j <= i; j++) {
 8                 res[i] = Math.min(res[i], res[i - j * j] + 1);
 9             }
10         }
11         return res[n];
12     }
13 }

 

JavaScript实现

 1 /**
 2  * @param {number} n
 3  * @return {number}
 4  */
 5 var numSquares = function (n) {
 6     let dp = new Array(n + 1).fill(0);
 7     for (let i = 0; i <= n; i++) {
 8         dp[i] = i;
 9         for (let j = 1; j * j <= i; j++) {
10             dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
11         }
12     }
13     return dp[n];
14 };

 

LeetCode 题目总结

[LeetCode] 279. Perfect Squares

标签:java   动态   一个   组成   find   func   asc   需要   logs   

原文地址:https://www.cnblogs.com/cnoodle/p/13200933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!