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];
    }
}
相关推荐
lzhdim5 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ8 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one10 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David10 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David11 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪11 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪11 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
java_nnnn13 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
小羊没烦恼!13 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.13 小时前
202609CSP认证P3
算法