279. Perfect Squares

我的方法,感觉思路不够清晰,不过还是有进步的。对DP有种莫名的恐惧,下次加油。

class Solution {
public:
    int numSquares(int n) {
       // n=8;
        if(n<=3) return n;
        vector <int> dp(n+1,INT_MAX);//初始值是多少
        //dp[0]=1;
        dp[1]=1;
        dp[2]=2;
        dp[3]=3;
        for(int i=0;i*i<=n;i++) dp[i*i]=1;
        int j=0;
        for(int i=4;i<=n;i++)
        {
            int tmp=(int)sqrt(i);
            while(tmp>=0)
            {
                j=i-tmp*tmp;
                tmp--;
                if(j==0) 
                {
                    dp[i]=1;
                    break;
                }
                else //if(dp[j]!=INT_MAX)
                {
                    //printf("1113");
                    dp[i]=min(dp[j]+1,dp[i]);//?dp[j]+1:dp[i];
                }          
            }
           // printf("dp[%d]=%d\n",i,dp[i]);
        }
        return dp[n];
    }
};

这样的思路才是清晰的。

class Solution {
public:
    int numSquares(int n) {
        if(n<=3) return n;
        vector <int> dp(n+1,INT_MAX);//初始值是多少
        for(int i=1;i*i<=n;i++) dp[i*i]=1;
        int j=0;
        dp[0]=0;
        dp[1]=1;
        dp[2]=2;
        dp[3]=3;
        for(int i=4;i<=n;i++)
        {
            for(int j=1;j*j<=i;j++)
            {
                dp[i]=min(dp[i-j*j]+1,dp[i]);        
            }
        }
        return dp[n];
    }
};

猜你喜欢

转载自blog.csdn.net/momo_mo520/article/details/80150916