阿亮的算法之路——279完全平方数

2024-01-07 02:59
文章标签 算法 完全 平方 279 阿亮

本文主要是介绍阿亮的算法之路——279完全平方数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动态规划集中练习

题目详情

题目详情

自己尝试

因为是动态规划的集中练习,所以第一思路就是用动态规划去做。其实这种后面的会受到前面的影响的题,大都会第一想到动态规划。

这题我想了一会儿,有了大概的思路,
思路就是:
状态转移:当前n的最小次数= 所有可以组成n的两个整数的最小次数的和中最小的

第一次代码
    public static int numSquares(int n ){int [] dp = new int[n+1];for (int i = 1; i <= Math.sqrt(n); i++){ dp[i * i] = 1; }int [] array = new int[n/2];for (int i = 2; i <= n; i++){for (int j = 1; j <= i/2; j++){ array[j-1] = dp[j] +dp[i-j]; }if (dp[i] == 0){dp[i] = array[0];for (int anArray : array){if (anArray != 0 && dp[i] > anArray){ dp[i] = anArray; }}}}return dp[n] ;}

提交结果
提交结果
可以完成功能,但是有三层for循环,将速度拉得很慢很慢。偶尔一次可以提交通过,很多时候会超时,总是被最后 数很大的用例卡住。

第二次代码

尝试将代码优化,然后将一个数组换成了ArrayList

    public static int numSquares(int n ){int [] dp = new int[n+1];for (int i = 1; i <= Math.sqrt(n);i++ ){ dp[i*i]  = 1; }ArrayList<Integer> array = new ArrayList<>();for (int i = 2; i <= n; i++){for (int j = 1; j <= i/2; j++){ array.add(j-1,dp[j] +dp[i-j]) ; }if (dp[i] == 0){dp[i] = Collections.min(array);array.clear();}}return dp[n] ;}

自己测试也是可以完成功能的,但是提交直接超时。测试总用例588个,第一次还能坚持到最后一个用例,这次才520多个用例就超时了。

说明ArrayList的效率比数组要低,其实想想也是,ArrayList是对数组的封装,如果没有指定初始化容量,当需要的容量大了之后,会进行频繁的数组复制扩容。

第三次代码
        int [] dp = new int[n+1];for (int i = 1; i <= Math.sqrt(n);i++ ){ dp[i*i]  = 1; }int [] array = new int[n/2];for (int i = 2; i <= n; i++){if (dp[i] == 0){dp[i] = dp[1] + dp[i - 1];for (int j = 2; j <= i / 2; j++){ dp[i] = dp[i] > dp[j] + dp[i - j] ? dp[j] + dp[i - j] : dp[i]; }}}return dp[n] ;

进行了优化,少了一层for循环
提交结果这次可以稳定通过,但是还是很差,

第四次代码

思考如何能再次优化,在获取最小次数的时候,如果次数是2,那我就直接结束最内层循环,跳到最外层循环,因为次数为1的数,肯定是一些完全平方数,那么剩下的数,是2的肯是最小的了。

    public static int numSquares(int n ){int [] dp = new int[n+1];for (int i = 1; i <= Math.sqrt(n);i++ ){ dp[i*i]  = 1; }int [] array = new int[n/2];a:for (int i = 2; i <= n; i++){if (dp[i] == 0){dp[i] = dp[1] + dp[i - 1];for (int j = i/2; j >=  2; j--){dp[i] = dp[i] > dp[j] + dp[i - j] ? dp[j] + dp[i - j] : dp[i];if (dp[i] == 2){ continue a; }}}}return dp[n] ;

如此一来,效率果然大幅度提升,
提交结果比上一次直接提高了两倍,但是还是很差,所有提交通过中最末尾的。

大佬思路

无论我再怎么优化,总是需要几百毫秒,虽然比我一开始有很大的进步,但是水平来看,都是很差的,难道是我的思路不对??

寻思着大佬是怎么做的,就去看了一下大佬的代码

        int[] dp = new int[n + 1]; // 默认初始化值都为0for (int i = 1; i <= n; i++){dp[i] = i; // 最坏的情况就是每次+1for (int j = 1; i - j * j >= 0; j++){dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程}}return dp[n];

提交结果
提交结果果然很优秀,但其实他的思路和我一模一样,但是处理得很巧妙。

这篇关于阿亮的算法之路——279完全平方数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578511

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1