279. 完全平方数

解法一、回溯法:

java 复制代码
class Solution {
    public int numSquares(int n) {
        return numSquaresHepler(n);
    }
    public int numSquaresHepler(int n){
        if(n == 0) return 0;
        int count = Integer.MAX_VALUE;
        for(int i = 1; i * i <= n; i++){
            count = Math.min(count,numSquaresHepler(n - i * i) + 1);
        }
        return count;
    }
}

解法二、HashMap 优化回溯法

解法一超时,解法二优化通过使用 HashMap 保存

java 复制代码
class Solution {
    public int numSquares(int n) {
        return numSquaresHepler(n,new HashMap<Integer,Integer>());
    }
    public int numSquaresHepler(int n,HashMap<Integer,Integer> map){
        if(map.containsKey(n)) return map.get(n);
        if(n == 0) return 0;
        int count = Integer.MAX_VALUE;
        for(int i = 1; i * i <= n; i++){
            count = Math.min(count,numSquaresHepler(n - i * i,map) + 1);
        }
        map.put(n,count);
        return count;
    }
}

解法三、动态优化

递归相当于先压栈压栈然后出栈出栈,动态规划可以省去压栈的过程。

动态规划的转移方程就对应递归的过程,动态规划的初始条件就对应递归的出口。

java 复制代码
class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n+1];
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[0] = 0;
        for(int i = 1; i <= n; i++){
             //依次减去一个平方数
            for(int j = 1; j * j <= i; j++){
                dp[i] = Math.min(dp[i],dp[i-j*j]+1);
            }
        }
        return dp[n];
    }
}
相关推荐
小O的算法实验室5 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
Tbisnic5 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx6 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归7 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing7 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习7 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨8 小时前
基础数论总结
笔记·学习·算法
夜不会漫长9 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng10 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背11 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline