[LeetCode]Perfect Squares
2015-11-11 15:41
429 查看
题目链接:Perfect Squares
题目内容:
Given a positive integer n, find the least number of perfect square numbers (for example,
For example, given n =
题目解法:
最初看到这个题,我想到的是回溯法,剪了半天的枝还是各种超时,后来参考了xudli的解法,才知道这道题用动态规划更合适。
我们设d[i]=a表示数字i对应的least number of perfect square numbers为a,则显然d[1]=1为初始条件,接着我们用背包问题的思想,对于i从2到n,尝试向其中放入perfect square number j,j从1开始枚举,每次放入后得到的结果为d[i - j*j]+1,也就是在不放入j的least number基础上+1得到d[i]的最小值,对于不同的j,我们应该选取其中最小的那个,也就是说:d[i]
= min{d[i-j*j],j=1,2,3...,j*j<=i}。
最后,d
就是结果。
代码如下:
题目内容:
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
3because
12 = 4 + 4 + 4; given n =
13, return
2because
13 = 4 + 9.
题目解法:
最初看到这个题,我想到的是回溯法,剪了半天的枝还是各种超时,后来参考了xudli的解法,才知道这道题用动态规划更合适。
我们设d[i]=a表示数字i对应的least number of perfect square numbers为a,则显然d[1]=1为初始条件,接着我们用背包问题的思想,对于i从2到n,尝试向其中放入perfect square number j,j从1开始枚举,每次放入后得到的结果为d[i - j*j]+1,也就是在不放入j的least number基础上+1得到d[i]的最小值,对于不同的j,我们应该选取其中最小的那个,也就是说:d[i]
= min{d[i-j*j],j=1,2,3...,j*j<=i}。
最后,d
就是结果。
代码如下:
class Solution { public: int getMin(int a, int b){ return a < b ? a : b; } int numSquares(int n) { int *d = new int[n+1]; d[1] = 1; // d[i]表示数字i的Prefect Seuares值。 for(int i = 2; i <= n; i++){ int j = 1; int min = 99999999; while(j*j <= i){ if(j*j == i){ min = 1; break; } min = getMin(min,d[i-j*j] + 1); j++; } d[i] = min; } return d ; } };
相关文章推荐
- H5地理定位
- myeclipes忽略js错误,取消验证
- 当鼠标点击页面其他地方时隐藏某个元素
- cdh5.4.7 sqoop使用
- CSS visibility 属性 元素是否可见
- AngularJS快速入门
- html&css 学习资料
- javascript中的this值
- 很多人想要的Jquery 加载Loading效果,可以加到自己的项目中,结合Ajax使用
- angularJS实例之购物车
- jquery bind()与unbind()用法
- JS的toFixed方法出错 重写
- jquery $(document).ready() 与window.onload的区别
- html 块级元素和行内元素
- jQuery实现页面详情展开收起
- 每个程序员都会的 35 个 jQuery 小技巧
- 用jquery.form实现多个submit按钮提交
- 在wordpress上制作一款插件
- angularjs 学习笔记
- rem 产生的小数像素问题---修复响应式开发