按平方数来分割整数
题目描述:
For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.
思路分析:
将n以内的平方数都求出来,然后设置数组dp[i],表示整数i按平方数分割的个数,则dp[n]表示整数n按平方数分割的个数,那么我们可以得到状态转移方程dp[i]=dp[i-square]+1。
代码:
public int numSquares(int n){
List<Integer>squareList=generate(n); //生成n以内的所有平方数
int []dp=new int[n+1];
for(int i=1;i<=n;i++){
int min=Integer.MAX_VALUE;
for(int square:squareList){
if(square>i) //平方数比当前的n还大,那么退出
break;
min=Math.min(min,dp[i-square]+1);
}
dp[i]=min;
}
return dp[n];
}
public List<Integer>generate(int n){ //生成平方数
List<Integer>res=new ArrayList<>();
int square=1;
int diff=3;
while(square<=n){
res.add(square);
square=square+diff;
diff=diff+2;
}
return res;
}