题目的链接在这里: https://leetcode-cn.com/problems/perfect-squares/
题目大意
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
一、示意图
二、解题思路
动态规划
代码如下:
class Solution {
public int numSquares(int n) {
int count=0;
//我感觉就像是一个dp[n]=min(dp[n-1],dp[n-4],....)+1这样子
//所以索性一个比较暴力的方法就是创建出这个 但是出这个 比较好的是可以通过n来创建
int dp[]=new int[n+1];
//然后把n之前的都进行设置
for(int i=1;i<=n;i++){
//如果这个位置就直接是完全平方数的话 就可以直接设置为1
if(judge(i)){
//写一个方法来判断是不是完全平方数
dp[i]=1;
}
//如果不是完全平方数的话 就需要进行判断了
else{
//把小于i的完全平方数都进行初值判断
int min=1000;
for(int k=1;(k*k)<i;k++){
//这个k就是小于i的所有完全平方数 然后找到最小值 感觉是这里的问题
//这里应该不是k 而是i-k 因为比如dp[8] 应该可能是 dp[7]+1 或者dp[4]+4 这个样子吧
if(min>dp[i-k*k])
min=dp[i-k*k];
}
//最后让i等于 min加一
dp[i]=min+1;
}
}
return dp[n];
}
private boolean judge(int i) {
//这个就是判断方法
double a=Math.sqrt(i);
int b=(int) a;
return (a-b)==0;
}
}