哈喽大家好,这里是万诺工作室,接下来将会陆续推出一系列关于面试的时候常见的手撕代码的题目,欢迎大家交流!


一、题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

二、 题目解析a.暴力解法

很多没有经验的同学看到这道题的最直观的做法就是,暴力解法。所谓暴力解就是不管不顾,把所有可能出现的情况遍历一次,再用一个变量记录最优值。这种做法固然不错,特别是没有时间复杂度的笔试题,大部分情况是可以AC的。但是这也是面试官最不愿看到的,相信很多同学会有这样的经验,面试的题目把笔试题目拿出来让你再重新做一次……由于暴力解法不是最好的方法,这里就仅仅是展示一下思路,不把代码写出来。所谓的暴力,就是不管不顾,把所有可能发生的情况的列举出来,不管会不会重复计算,反正我只要可以算出结果就行了。具体思路是:寻找所有的可能组成的子序列,求得最大值实现只需要两个for循环即可,代码实现也比较简单,但是时间复杂度达到了可怕的O(n^2)。

b.动态规划这道题目的解法有很多,贪心和分治都可以,但是效率最高的也就是我们这篇文章要讲解的动态规划。动态规划是什么意思呢?百度的解释是这样的:

有一种来自一本日本的程序设计书籍中的说法我比较赞同,因为对于初学者比较好理解:动态规划就是记录结果再利用。也就是说,一些结果我们在计算过程中是会遇到不止一次的,那我们不需要每次遇到都去重新算一次,而是从我们存下来的数据里面去拿。这样说可能还不好理解,举个最简单的例子:

斐波那契数列

但这不是最好的方式,如图所示,会有大量的重复的子结果并且会进行大量重复的运算,当我们的n一大的时候,复杂度可想而知。

所以解决方案就是把每一个子结果都记录下来,后续有需要用的直接调用即可,不需要继续递归计算。这也就是一种动态规划的思想。

好像有点跑题了,言归正传。那这道题要怎么做呢?首先动态规划我们是需要找出状态转移方程式,也就是从当前状态转移到另一个状态的一个等式。对于这道题来说,我们先设置一个状态dp[i]表示到第i个数的最大子序列的和,所以对于dp[i-1]来说,到了第i位,之前的最长的子序列只有两种情况,要么把第i位跟之前的子序列加上,要么把第i位当作新的起点。因此状态转移方程式就是:

dp[i] = max(dp[i-1]+nums[i],nums[i]) 

只要理解了这个方程式,写出代码来就是分分钟的事情了。那这里就把代码简单的贴一下:

class 

从代码就看的出来,这种方式只需要进行一次遍历就可以得到结果,也就是说时间复杂度是O(n)。什么概念呢?下面贴一张O(n^2)和O(n)的时间增长对比,那就知道当我们的基数增大的时候,运算所使用的时间将会产生巨大的差别。所以啊,慎用暴力


关注万诺工作室,持续输出对你有用的干货!

动态规划法求最大字段和时间复杂度_面试必备——手撕代码(1)“最大子序列和”...相关推荐

  1. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  2. Interview:算法岗位面试—11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码、项目考察、比赛考察、图像算法的考察等

    Interview:算法岗位面试-11.06早上上海某智能驾驶科技公司(创业)笔试+面试之手撕代码.项目考察.比赛考察.图像算法的考察等 导读:该公司是在同济某次大型招聘会上投的,当时和HR聊了半个多 ...

  3. 蛮力法求最大字段和时间复杂度_蛮力法

    蛮力法的主要思想就是用最简单的思路解决问题,一般性能不好,但仍然很重要. 理论上蛮力法可以解决可计算领域的各种问题 蛮力法解决较小规模问题是可接受的,如果设计一个更高效算法代价不值得 蛮力法可以作为时 ...

  4. 蛮力法求最大字段和时间复杂度_只需十个字,让你掌握推拿手法的秘诀

    学习中医推拿的都知道手法是其中的重点.手法掌握的熟练程度和操作的专业性直接影响到推拿的效果.但是很多新手刚学习推拿时,认真努力却效果不佳,找不到其中的门道,劳而少功.那是你不知道这些推拿的小窍门,这都 ...

  5. 蛮力法求最大字段和时间复杂度_硬笔字应该选择的工具,你了解吗?

    原标题:硬笔字应该选择的工具,你了解吗? 硬笔书法强调的是实用性,美观大方的同时又要求书写速度,易写易认,可以说是从书法中简化出来的一个分支,但是这个分支在我们的日常生活中使用极为广泛,由此便可以知道 ...

  6. 银行java面试题手写代码_面试系列——手写代码实现(一)

    前言 本文是面试系列篇的实现篇.笔者整理了面试过程中可能会遇到的手写实现,以及它的原理.这可以帮助面试者在笔试环节获得良好的加分. 其他文章系列,欢迎关注我文末的公众号 正文 apply和call a ...

  7. 2023华为OD面试手撕代码经验分享

    我们先来看下这个同学的面试经历吧,非常有借鉴的意义. [22届考研渣渣的od求职之旅,推荐一下两个人,德科hr和牛客的老哥] "*********",hr给了机会吧,一开始我都没想 ...

  8. 华为手撕代码c语言题目,想去面试?这10道最高频的手撕代码题都会了吗?

    原标题:想去面试?这10道最高频的手撕代码题都会了吗? 来源:Python与算法之美 ID:Python_Ai_Road 作者:梁云1991 想去看机会?下面这10道最高频的手撕代码面试题都会了吗? ...

  9. 2023华为OD面试手撕代码真题

    很多小伙伴后台私信我,让我出一些面试中的手撕代码题. 一般面试的时候每一轮技术面都会出一到两个手撕代码题,这些题的特点就是,非常短小,易于理解.不可能会再出阅读理解一样的机试题的.但是这些题目也非常注 ...

  10. 前端面试高频手写代码题

    前端面试高频手写代码题 一.实现一个解析URL参数的方法 方法一:String和Array的相关API 方法二: Web API 提供的 URL 方法三:正则表达式+string.replace方法 ...

最新文章

  1. 一篇文章带你解析,乐观锁与悲观锁的优缺点
  2. PHP中用于精确计算的bcmath扩展
  3. Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法
  4. PHP获取服务器端的相关信息
  5. BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
  6. 传统反病毒软件厂商学会新把戏
  7. matlab 两点划线,matlab学习2-画线
  8. opencv 平滑处理
  9. C++中的string
  10. “要从中学开始普及人工智能教育,但不能增加学生负担”
  11. 教你在macOS Big Sur 11.0 系统中在右键菜单中添加发送共享到微信或QQ的功能?
  12. 378.有序矩阵中第K小的元素
  13. 计算机视觉大佬--何凯明
  14. linux 内核 addr2line,內核調試 arm-none-linux-gnueabi-addr2line 工具使用
  15. B站崩了、Facebook崩了,我们到底该怎么保证高可用
  16. 车牌号正则表达式(含新能源车牌)
  17. Arcgis for JS实现台风运动路径与影像范围的显示
  18. 高斯消元法与LU分解
  19. 论python在金融行业的重要性_论金融在各行业的重要性
  20. 腾讯企业邮信任此计算机,讲述qq企业邮箱启用微信动态密码的方法

热门文章

  1. 7.性能之巅 洞悉系统、企业与云计算 --- 内存
  2. 1.TCP/IP 详解卷1 --- 概述
  3. 9. jQuery 停止动画
  4. [2019杭电多校第四场][hdu6623]Minimal Power of Prime
  5. 量子纠缠2——CHSH不等式
  6. js(JavaScript):事件,元素(增删改查)
  7. Spring 在xml配置里配置事务
  8. GitHub for Windows使用教程(一)
  9. Spring pom配置详解(转)
  10. C++/CLR 使用(VS2012,VS2013,VS2015)编写