279. Perfect Squares(DP or BFS)
来源:互联网 发布:java判断是否有双引号 编辑:程序博客网 时间:2024/05/27 00:46
一、题目描述
简单的DP,转化问题为BFS问题
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.
二,算法与代码
DP解法:只要发现对于非平方数(例如:2,3,5,6),它们的最小组成一定是由n个平方数和m个非平方数组成,而非平方数其实都只能由N个1组成,如2 = 1+ 1, 3 = 1 + 1 + 1。所以得到转移方程
dp[i]=min(dp[i],1+dp[i−j∗j])
class Solution {public: int numSquares(int n) { int res; vector<int> dp(n+1, 0); for(int i = 1; i <= n; i++) { dp[i] = i+1; for(int j = 1; j <= sqrt(i); j++) { dp[i] = min(dp[i], 1+dp[i - j*j]); } } return dp[n]; }};
BFS解法:如图所示,BFS的解法是先找出原始的小于n的所有平方数(allNs),以此作为第二层结点,通过与allNs中的平方数进行组合,找出可能的其他所有的小于n的结点,不断向外辐射这棵树,直到找到一条路径上的结点的数的和等于n,此时该路径上的数即为n的最小的平方数的组成,数的层数即为所求的最小数。
class Solution {public: int numSquares(int n) { if(n <= 0) return 0; vector<int> squareNumber, countsOfnumSquares(n+1,0); for(int i = 0; i*i <= n; i++) { squareNumber.push_back(i*i); //平方数 countsOfnumSquares[i*i] = 1;//n平方数的 numSquares 为1 if(i*i == n) return 1; } queue<int> tmp; for(int i = 0; i < squareNumber.size(); i++) tmp.push(squareNumber[i]); int count = 1; while(!tmp.empty()) { count++; for(int k = 0, size = tmp.size(); k < size; k++) { int cur = tmp.front(); for(int i = 0; i < squareNumber.size(); i++) { if(cur + squareNumber[i] == n) { return count; } else if(cur + squareNumber[i] < n && countsOfnumSquares[cur+squareNumber[i]] == 0) { countsOfnumSquares[cur+squareNumber[i]] = count; tmp.push(cur + squareNumber[i]); } else if(cur + squareNumber[i] > n) { break; } } tmp.pop(); } } }};
阅读全文
0 0
- 279. Perfect Squares(DP or BFS)
- [Leetcode] #279 Perfect Squares (BFS, DP)
- leetcode 279. Perfect Squares【dp】
- LeetCode Perfect Squares DP
- 279. Perfect Squares(难)
- 279. Perfect Squares-Leetcode(关于DP的再深入研究)
- leetcode 279. Perfect Squares 一个很不错的DP
- LeetCode 279. Perfect Squares(完美平方)
- 279. Perfect Squares (完全平方数)
- 279.Perfect Squares
- [leetcode] 279. Perfect Squares
- 279. Perfect Squares
- 279. Perfect Squares LeetCode
- leetcode 279. Perfect Squares
- leetcode 279. Perfect Squares
- [LeetCode]279. Perfect Squares
- 279. Perfect Squares
- 279. Perfect Squares
- 根据输入的数量生成符合EXCEL列标的数组
- mysql断电后启动失败数据库表损坏解决
- Java加载图片
- 10进制转16进制
- 算法练习(29):Count Primes
- 279. Perfect Squares(DP or BFS)
- MyEclipse maven build后控制台无输出
- Android 带点击事件的RecyclerView所用Adapter
- PythonStock(16):使用bokeh 展示,股票中的16个常用指标
- linux yum 安装mysql
- 2 dubbo源码之集群容错实现
- 菜单优化
- php中file_get_contents与curl性能比较分析
- Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45: dofile has been disabled