LeetCode-279. Perfect Squares

本文介绍了一种使用动态规划算法解决完美平方数之和的问题,旨在寻找构成给定正整数所需的最少完美平方数个数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, …) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

题意

给定一个正数,寻找完美平方数之和等于这个正数并且使其完美平方数的个数最少

分析

用一个命名为num的数组来保存个数
1. n=1,因为1是完美平方数,所以n[1]=1
2. n=2,2=1+1,所以n[2]=2
3. n=3,3=2+1=1+1+1,所以n[3]=3
4. n=4,4=3+1或者4=4,取较小值,所以n[4]=1
5. …
n. n=n,n=min(num[n-i]+1),其中i为完美平方数
从上述流程可以看出,对于每个n,它的最小完美平方数的个数等于n-i时的最小完美平方数个数加1,所以需要用到动态规划,num的初始值是0。

实现

class Solution {
    public int numSquares(int n) {
        if(n<=0)
            return 0;
        int[] leastNum=new int[n+1];
        Arrays.fill(leastNum,Integer.MAX_VALUE);
        leastNum[0]=0;
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j*j<=i;++j)
            {
                leastNum[i]=Math.min(leastNum[i],leastNum[i-j*j]+1);
            }            
        }
        return leastNum[n];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值