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];
    }
}
相关推荐
乐迪信息1 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.2 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕3 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
lvwangshu3 小时前
T2 最长上升子序列(lis)题解
动态规划·题解·技巧·性质题·思维好题
tangguofeng3 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆4 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的5 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙5 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头
zhangfeng11336 小时前
国产GPU/AI算力芯片现状(修订完整版 · 截至2026年9月
人工智能·算法·ai编程·npu
学代码的CJY6 小时前
从代码出发理解时间复杂度与空间复杂度
数据结构·算法