Perfect Squares

来源:互联网 发布:权然后知轻重 编辑:程序博客网 时间:2024/06/05 06:10

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.

分析:
O(n)解法,

http://bookshadow.com/weblog/2015/09/09/leetcode-perfect-squares/

https://leetcode.com/discuss/56982/o-sqrt-n-in-ruby-and-c

据说是数论,然而并不懂

int numSquares(int n) {    while (n % 4 == 0)        n /= 4;    if (n % 8 == 7)        return 4;    for (int a=0; a*a<=n; ++a) {        int b = sqrt(n - a*a);        if (a*a + b*b == n)            return !!a + !!b;    }    return 3;}
O(n*sqrt(n))解法:

动态规划,还是可以接受的

dp[i]凑成i的所需的平方数数字的最小个数;

初始化:初始化dp数组为无穷大,dp(i*i)=1,其中:i*i <= n
状态转移方程:dp[i+j*j] = min(dp[i+j*j], dp[i] + 1);怎么推到出来的呢o(╯□╰)o



动态规划方程推导:

第一,确定最优化子问题
 第二,定义问题解集合,确定维度的明确含义定义 
第三,分析分治策略,并确定最优化子解归结为原问题的方法 - 转移方程出自这里 
第四,初始化简单解 
第五,确定推导顺序 
第六,在结果集中寻找问题解。 
动态规划的设计除了上述标准过程外,其他就需要因题目的不同而灵活运用,尤其是第一项和第二项尤为重要。
还不是很懂o(╯□╰)o刷完leetcode再好好研究

http://blog.csdn.net/thisinnocence/article/details/41073275



0 0
原创粉丝点击