您的位置:首页 > Web前端

leetcode之Perfect Squares

2015-12-03 22:29 344 查看
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.

题目描述:给定一个正整数n,找到最少的平方数使得和为n

思路:采用动态规划的解法,设dp[i]表示组成i的最少平方数的个数,则可以得到如下的递推关系式:

dp[i] = min(dp[i-j*j]+1), j的范围为:[i,sqrt(i)]

代码如下:

class Solution {
public:
int numSquares(int n) {
vector<int>dp(n+1,n+1);
dp[0] = 0;
for(int i = 1; i <=n; ++i){
for(int j = 1; j <=sqrt(i); ++j){
dp[i] = min(dp[i],dp[i-j*j]+1);
}
}
return dp
;
}
};


当然,也有数学的找规律的方法,代码如下:

class Solution {
public:
int is_square(int n){
int temp = (int) sqrt(n);
return temp * temp == n;
}
int numSquares(int n) {
while ((n & 3) == 0) //n%4 == 0
n >>= 2;
if ((n & 7) == 7) return 4; //n % 8 == 7
if(is_square(n)) return 1;
int sqrt_n = (int) sqrt(n);
for(int i = 1; i<= sqrt_n; i++){
if (is_square(n-i*i)) return 2;
}
return 3;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: