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];
    }
}
相关推荐
csdn_aspnet8 分钟前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞32 分钟前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
Oneshot4 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
文丑颜不良啊4 小时前
LeetCode2541~2560题目解析
java·leetcode
青少儿编程课堂5 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong5 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
小王C语言5 小时前
优选算法:分治-归并排序
算法
非优秀程序员16 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法