leecode:Perfect Squares(JS解答)
思路一:动态规划
function numSquares1(n: number): number {
let squareNums:number[] = [];
let square_n = Math.floor(Math.sqrt(n));
let dp:number[] = new Array(n+1).fill(Number.MAX_SAFE_INTEGER);
for(let i = 0; i <= square_n+1; i++){
squareNums.push(i*i);
}
dp[0] = 0;
for(let i = 1; i <= n; i++){
for(let j = 0; j < square_n+1; j++){
if(i < squareNums[j]) break;
dp[i] = Math.min(dp[i], dp[i-squareNums[j]]+1);
}
}
return dp[n];
};
思路二:贪心
function numSquares2(n: number): number {
let squareNums:number[] = [];
let square_n = Math.floor(Math.sqrt(n));
for(let i = 0; i <= square_n+1; i++){
squareNums.push(i*i);
}
let count:number = 1;
for(;count <= n;count++){
if(canBeDivided(n,count)){
return count;
}
}
return count;
function canBeDivided(n:number,count:number){
if(count === 1) return squareNums.indexOf(n) != -1;
for(let val of squareNums){
if(canBeDivided(n-val,count-1)){
return true;
}
}
return false;
}
};
思路三:贪心+bfs
function numSquares3(n: number): number {
let squareNums:number[] = [];
let square_n = Math.floor(Math.sqrt(n));
for(let i = 1; i <= square_n; i++){
squareNums.push(i*i);
}
let setQueue:Set<number> = new Set<number>();
setQueue.add(n);
let level:number = 0;
let flag = false;
while (setQueue.size > 0){
// console.log(setQueue)
level++;
let newSetQueue:Set<number> = new Set<number>();
setQueue.forEach(queueVal => {
for(let val of squareNums){
if(queueVal == val){
flag = true;
return level;
}else if(queueVal < val){
break;
}else{
newSetQueue.add(queueVal-val)
}
}
})
if(flag) return level;
setQueue = newSetQueue;
}
return level;
}