LeetCode--279. 完全平方数--中等

题目

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12

输出:3

解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13

输出:2

解释:13 = 4 + 9

题解

java 复制代码
class Solution { public int numSquares(int n) { 
    int[] dp = new int[n + 1]; // 默认初始化值都为0 
    for (int i = 1; i <= n; i++) { 
        dp[i] = i; // 最坏的情况就是每次+1 
        for (int j = 1; i - j * j >= 0; j++) { 
            dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程 
            } 
        } 
        return dp[n]; 
    } 
}

解析

出自:画解算法:279. 完全平方数

java 复制代码
class Solution {
    public int numSquares(int n) {
        // 创建一个长度为 n+1 的 dp 数组,dp[i] 表示组成整数 i 所需的最少完全平方数个数
        int[] dp = new int[n + 1]; // 默认初始化值都为 0(Java 中 int 数组默认初始化为 0)

        // 从 1 遍历到 n,依次计算每个数字 i 的最小平方数组合数
        for (int i = 1; i <= n; i++) {
            // 初始化 dp[i] 为最坏情况:i 由 i 个 1 相加而成(因为 1 是完全平方数)
            dp[i] = i; // 例如:5 = 1+1+1+1+1 → 共 5 个

            // 尝试所有可能的完全平方数 j*j(j 从 1 开始)
            for (int j = 1; i - j * j >= 0; j++) {
                // 状态转移方程:
                // 如果用 j*j 作为其中一个平方数,那么剩下的部分是 i - j*j,
                // 所需的最少个数就是 dp[i - j*j] + 1(+1 表示加上当前的 j*j)
                // 取所有可能 j 中的最小值
                dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
            }
        }

        // 返回组成 n 所需的最少完全平方数个数
        return dp[n];
    }
}
相关推荐
艾莉丝努力练剑5 分钟前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
偷吃的耗子36 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
张登杰踩2 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0072 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零2 小时前
变点检测算法PELT
算法