目录

  • 前言
  • 具体
  • 结语

如果觉得本文有所帮助,记得点赞收藏

前言

你在打王者荣耀的时候,是否经常会遇到这种情况:和对面同位置对线的时候,自己也没有太大失误,但是为啥对面经济比我高?能够压着我打?——是我太菜了

这可能就是你们细节上的差距,别人可能对兵线、技能、英雄机制搞得更清楚,每一步都清清楚楚,刷题也是一样,同样的方法,为啥别人的比你快很多,也需要注意一下细节。

笔者最近再刷LeetCode,对于正常一道题来说,时间的耗费有两个差距:

时间复杂度的差距

时间复杂度上的差距,因为很多题正常的暴力是O(n2)甚至更慢的时间复杂度,这些方法就算能过但是时间耗费很长,如果你发现你的算法过的时间在后30%那就说明你的方法不对了。在复杂度的差距差的可能几百毫秒,几十毫秒,而快的可能是几毫秒。

细节上的差距
很多题可能大家能够想到的比较好的方法的时间复杂度可能差不多,自己也是几毫秒但是自己的排名依然在50%-60%左右,这到底是为什么呢?是因为你的细节还需要优化,你整体复杂度虽然掌握了,但是你可能多算了几次循环,几次运算。所以当条件允许你需要静下来思考下怎么样才能让自己的程序跑在前90%以上。怎样去优化这个时间。

具体

笔者就拿今天刷的这道力扣题来讲讲,力扣的第11题,思路很清晰就是从两边向中间动态压缩区间,是一个O(n)的时间复杂度。

笔者第一次使用这个写法是4ms:

public int maxArea2(int[] height) {int max = 0;int left = 0;int right = height.length - 1;while (left < right) {max = Math.max(max, Math.min(height[left], height[right]) * (right - left));if (height[left] > height[right])// 右侧更小right--;else {left++;}}return max;}


但是我在研究这段代码时候发现以下几点问题可以优化:

  • 使用Math.max()判断最大值最小值的时候,下面在判断是左指针右移还是右指针左移动重复判断了,我们可以手动比较大小重复利用这次计算去完成相同的操作。
public int maxArea3(int[] height) {int max = 0;int left = 0;int right = height.length - 1;while (left < right) {if (height[left] < height[right]) {max = Math.max(max, height[left] * (right - left));left++;} else {max = Math.max(max, height[left] * (right - left));right--;}}return max;
}

这样的一部优化之后时间来到了稳定的3ms:

还能继续优化嘛?当然能:

  • Math.max()返回double类型转成int需要一定成本,然而我们数据本身就是int类型可以直接计算。
  • 对数组取值的时候,比较取一次(两个值),计算取一次(一个值),而我们知道数组其实在内存中我们通过0号位置计算得到我们对应位置的数值,所以我们可以把3次计算减少成2次,用两个空间leftvalue和rightvalue记录左右数组位置的值。

通过上面的优化得到下面的代码:

public int maxArea4(int[] height) {int max = 0;int left = 0;int right = height.length - 1;int team = 0;int leftvalue=0;int rightvalue=0;while (left < right)  {leftvalue=height[left];rightvalue=height[right];if (leftvalue < rightvalue) {team = leftvalue * (right-left);if(max<team) {max=team;}left++;} else {team = rightvalue * (right-left);if(max<team) {max=team;}right--;}}return max;}

成功步入2ms大军。



还能到1ms嘛?

  • 我是暂时不能了,,各位大佬请便!

结语

虽然这些优化并没有得到质的改善,并且可能也比较初级,但是刷题的同时通过这种不断优化能够增加对计算机执行和原理的理解:哇,原来是这样。并且如果有时间养成这样的好习惯,相信不就以后,未来的调优专家就是你了!

如果觉得不过,记得点赞关注哦!公众号:bigsai,回复bigsai获得笔者珍藏学习资源。

刷题一个4ms的程序,代码如何优化到3ms再到2ms?相关推荐

  1. 使用 软考免费真题app刷题库 手机小程序版

    方案1: APP刷真题(免费真题app) 手机软件:软考题库(ios)/希赛软考助手(安卓版) 软考题库免费真题app,含有历年真题.模拟考试.高频考点.知识点整理,还有收藏功能,错题记录功能等等.有 ...

  2. 恶作剧c语言程序,自己用C语言编写的一个恶作剧小程序代码

    自己用C语言编写的一个恶作剧小程序代码 #include #include #include #define MAX 100 void hebingString(char s1[],char s2[] ...

  3. FPGA数字IC刷题58道Verilog题解代码及视频讲解【FPGA探索者】【同步/异步FIFO】【跨时钟】

    牛客 Verilog 刷题入门篇1~24 + 进阶篇1~34 题解代码,所有代码均能通过测试,配合视频讲解效果更佳.为避免内容冗余,本文只给出代码,部分题目给出必要说明. 很多题目本身出题有些问题,着 ...

  4. 掌中题库刷题神奇微信小程序介绍

    微信小程序无需安装.便于传播,安卓与ios平台都可以使用. "掌中题库"微信小程序,针对个人或单位用户进行复习备考.业务学习.党建活动.继续教育而设计. 程序功能实用,界面简约,尤 ...

  5. python 游戏引擎 cocos2d_2.2 完成一个Cocos2d游戏程序代码

    本视频基于**Python 3.6版本 Python语言之所以受欢迎,很大的原因是有很多可以使用的库,Python社区也有很多游戏开发库,其中较为优秀有:Cocos2d.Pyglet和Pygame,还 ...

  6. 牛客网Java刷题知识点之什么是代码块、普通代码块、静态代码块、同步代码块、构造代码块以及执行顺序...

    不多说,直接上干货! 这种形式的程序段我们将其称之为代码块,所谓代码块就是用大括号({})将多行代码封装在一起,形成一个独立的数据体,用于实现特定的算法.一般来说代码块是不能单独运行的,它必须要有运行 ...

  7. 看我如何用云函数撸一个PC小程序代码包在线解密工具

    前一段时间突发奇想,想白嫖腾讯云云函数的能力来实现无服务模式下 PC 端小程序包的在线解密(注意这里仅仅是做解密). 因为业余时间以捣鼓有意思的东西作为娱乐活动,对于小程序技术这块本身理解也是比较深刻 ...

  8. LeetCode面试刷题技巧-二分查找算法代码思路解析

    二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使用过二分查找的思想,不信的话,且听我慢慢为你道来. 不知道你有没有玩过这样一个游戏,猜数字.就是说一个人心里想了 ...

  9. Java基础学习总结(135)——Java代码性能优化实践经验再总结

    前言 代码优化的最重要的作用应该是:避免未知的错误.在代码上线运行的过程中,往往会出现很多我们意想不到的错误,因为线上环境和开发环境是非常不同的,错误定位到最后往往是一个非常小的原因.然而为了解决这个 ...

最新文章

  1. R语言描述性统计分析:相关性分析
  2. eplan图纸怎么发给别人_EPLAN标签导出材料清单(附模板+图文教程)
  3. CPU流水线的探秘之旅
  4. 淘宝+天猫+闲鱼卖的翻新货店家汇总(持续更新)
  5. 计算机网络英文面试题,计算机网络面试题整理
  6. java安装和环境配置
  7. Python3 基础学习笔记 C04【if 语句】
  8. 监督学习之knn、naive bayes、决策树算法实验_机器学习基本概念
  9. 测试面试集-Python接口自动化测试
  10. 吴恩达机器学习学习笔记第七章:逻辑回归
  11. 第12章[12.4] 鼠标移入移除时弹出和关闭窗口
  12. -bash: pip: command not found错误
  13. Setup Factory 打包工具部分功能代码解
  14. 如何配置程序集的版本策略
  15. java开发常用的工具类_java开发常用工具类
  16. QA:golang redis协议同时写入报错
  17. 分区表修复工具--DISKFIX
  18. win10计算器rsh_Win10计算器快捷键
  19. 文档服务器设置密码,服务器密码设置要求
  20. win10 Administrator账户被禁用怎么办?

热门文章

  1. cryptogen (2)generate 生成证书再举例
  2. 公钥密码--Diffie-Hellman密钥协商算法
  3. 【Python小游戏】扫雷游戏竟有世界排行榜,中国90后00后霸占半壁江山?
  4. 135. 分发糖果(贪心算法)
  5. 数据结构相关C语言代码
  6. 关于“ModuleNotFoundError: No module named ‘flask._compat‘”的解决
  7. 关于LookupError: No installed app with label ‘admin‘.报错的解决
  8. python操作mysql操作步骤
  9. python:将json数据写入到excel
  10. SQL注入是什么?如何防止?