首页 > 代码库 > leetcode-Perfect Squares-279

leetcode-Perfect Squares-279

输入整数n,求完全平方数的和等于n中完全平方数用得最少的个数

直观想法搜索,先处理n以内的完全平方数,然后搜索,但效率不行,整数范围内的完全平方数有40000多个,用搜索的方法相当于求集合的子集个数,时间是2^n,肯定超时

正解:dp

dp[i]表示完全平方数和等于i的最优解

dp[i]=min(dp[i-j*j]+1)

时间N*sqrt(N)

 1 class Solution { 2 public: 3     int numSquares(int n) { 4         if(n==0) return 0; 5         int dp[n+1]; 6         memset(dp,0,sizeof(dp)); 7         dp[1]=1; 8         for(int i=2;i<=n;i++){ 9             int mi=INT_MAX;10             int ok=0;11             for(int j=1;j*j<=i;j++){12                 if(j*j==i){13                     dp[i]=1;14                     ok=1;15                     break;16                 }17                 mi=min(mi,dp[i-j*j]+1);18             }19             if(!ok) dp[i]=mi;20         }21         return dp[n];22     }23 };

 

leetcode-Perfect Squares-279