力扣 完全平方数

动态规划,找到前几个状态做更新。

题目

从题可看出又是一道dp,只要找到一个最大的平方数,然后往回退到上个状态,然后再用回退的状态加回去这个平方数即加上这一种。注意这里的所含平方数并不是随着数字变大而变大的,因此还要加多一层循环做遍历的维护,目的是找到的平方数少。

java 复制代码
class Solution {
    public int numSquares(int n) {
        int[] f = new int[n + 1];
        for (int i = 1; i <= n; i++) {
             f[i] = Integer.MAX_VALUE;
            for (int j = 1; j * j <= i; j++) {
                f[i] = Math.min(f[i], f[i - j * j]+1);//通过减去一个平方数对前面已经遍历的f[i]进行筛选
            }
        }
        return f[n];
    }
}

这里对fi做了频繁更新,实际只需要在后面更新一次即可,在做比较时可以用一个临时变量去存,这样就可以优化一下维护状态的数组了。

java 复制代码
class Solution {
    public int numSquares(int n) {
        int[] f = new int[n + 1];
        for (int i = 1; i <= n; i++) {
            int minn = Integer.MAX_VALUE;
            for (int j = 1; j * j <= i; j++) {
                minn = Math.min(minn, f[i - j * j]);//通过减去一个平方数对前面已经遍历的f[i]进行筛选
            }
            f[i] = minn + 1;//更新当前数时加回去j*j这种情况
        }
        return f[n];
    }
}

然后也可以换一下内外层循环,先去生成所有完全平方数,然后做更新。

时间复杂度:O(n√n),空间复杂度:O(n)。

java 复制代码
class Solution {
    public int numSquares(int n) {
       
        int[] f = new int[n + 1]; 
        Arrays.fill(f, Integer.MAX_VALUE); 
        f[0] = 0;
        
        for (int i = 1; i * i <= n; i++) {
            for (int j = i * i; j <= n; j++) {

                f[j] = Math.min(f[j], f[j - i * i] + 1);
            }
        }
        
        return f[n];
    }
}

在做dp时,学会找到状态间的关系,也要注意维护状态的数组优化。

相关推荐
微尘hjx5 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
云和数据.ChenGuang5 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠5 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
silvamux_7 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
行走的陀螺仪8 小时前
【转型攻略】2026 年,后端 / 全栈工程师转 AI Agent 方向:能力地图、按周学习路线与面试要点
人工智能·面试·职场和发展
步行cgn8 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠8 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
小蒜学长8 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
Deng桑8 小时前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai