【Golang】LeetCode 279. 完全平方数

279. 完全平方数

题目描述

思路

"完全平方数"是一道需要使用一维动态规划来解决的问题。具体来说,题目当中需要我们求的是最少需要多少个"完全平方数"能够凑出给出的数字n。我们可以使用dp数组来表示i对应的数字最少需要多少个"完全平方数"累加才能够得到。

现在问题转变为,我们如何求每一个数字最少需要多少个完全平方数来进行表示?我们应该从1开始,顺序地对dp数组进行维护。具体来说,针对dp[1]而言,显然它的值就是1,因为它本身就是一个完全平方数;针对i == 2,也就是dp[2],显然它的最优解是两个1,它的状态转移方程是dp[2] = dp[1] + 1。接下来我们枚举一个比较大的例子,比如i == 10,想要求dp[10],假设我们已经知道了dp[1...9]的值,我们使用变量j来表示完全平方数的数值,我们应该找dp[1...9]当中的最小值,这个最小值对应的下标i应该同时满足i + j * j == 10,此时的dp[i] + 1就是dp[10]的值。

基于以上的例子,我们不难推导出dp数组的状态转移方程。显然我们需要一个双重循环来对dp数组进行维护,最外层的循环变量i的值就是具体的数字,而第二层循环j,我们用它来表示完全平方数,必须满足j * j <= i。由此,dp[i] = min(dp[i - j * j]) + 1

基于上述思路,我们就可以写代码来解决这道题了。

Golang 题解

go 复制代码
func numSquares(n int) int {
    // 返回和为 n 的完全平方数的最少数量
    dp := make([]int, n + 1)
    
    for i := 1; i <= n; i ++ {
        currMin := math.MaxInt
        for j := 1; j * j <= i; j ++ {
            currMin = min(currMin, dp[i - j * j] + 1)
        }
        dp[i] = currMin
    }

    return dp[n]
}
相关推荐
风筝在晴天搁浅28 分钟前
字节高频题 小于n的最大数
算法
LabVIEW开发30 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星35 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅37 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
汉克老师1 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数
数据皮皮侠2 小时前
上市公司创新韧性数据(2000-2024)|顶刊同款 EIR 指数
大数据·人工智能·算法·智慧城市·制造
WL_Aurora2 小时前
Python 算法基础篇之链表
python·算法·链表
科研前沿2 小时前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算