leetcode---Perfect Squares---动规、回溯

来源:互联网 发布:libsvm c语言 使用 编辑:程序博客网 时间:2024/05/21 02:52

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.

动规

class Solution {public:    int numSquares(int n)     {        int dp[n+1];        dp[1] = 1;        for(int i=2; i<=n; i++)        {            int min = INT_MAX;            int j = 1;            while(j * j <= i)            {                if(j * j == i)                {                    min = 1;                    break;                }                min = dp[i - j*j] + 1 < min ? dp[i - j*j] + 1 : min;                j++;            }            dp[i] = min;        }        return dp[n];    }};

回溯—超时

class Solution {public:    int best;    bool dfs(int n, int dep, int &cnt, int sum)    {        if(sum == n)        {            if(cnt < best)            {                best = cnt;                return true;            }        }        for(int i=dep; i>=1; i--)        {            int tmp = i * i;            sum += tmp;            if(sum <= n)            {                cnt += 1;                dfs(n, i, cnt, sum);                cnt -= 1;            }            sum -= tmp;        }        return false;    }    int numSquares(int n)     {        best = INT_MAX;        int dep = sqrt(n);        int sum = 0;        int cnt = 0;        dfs(n, dep, cnt, sum);        return best;    }};
0 0
原创粉丝点击