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];
    }
}
相关推荐
W23035765731 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
minji...2 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
语戚3 小时前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
skywalker_113 小时前
力扣hot100-7(接雨水),8(无重复字符的最长子串)
算法·leetcode·职场和发展
bIo7lyA8v4 小时前
算法稳定性分析中的输入扰动建模的技术9
算法
CoderCodingNo4 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
sinat_286945194 小时前
AI Coding 时代的 TDD:从理念到工程落地
人工智能·深度学习·算法·tdd
炽烈小老头4 小时前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法
ASKED_20194 小时前
从排序到生成:腾讯广告算法大赛 2025 baseline解读
人工智能·算法