14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~

算法知识点

动态规划

算法题目来源

力扣 | 题库 | 动态规划 |  剑指 Offer 42. 连续子数组的最大和

算法题目描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

做题思路

注:一下内容来自于力扣网站,单纯分享其官网对动态规划算法的运用,几行代码就能解决问题,比起我们几十行还不一定能解决问题的水平,是很有学习意义的

模板代码

C语言

int maxSubArray(int* nums, int numsSize) {int pre = 0, maxAns = nums[0];for (int i = 0; i < numsSize; i++) {pre = fmax(pre + nums[i], nums[i]);maxAns = fmax(maxAns, pre);}return maxAns;
}

时间复杂度:O(n)O(n)O(n),其中 nnn 为 nums\textit{nums}nums 数组的长度。我们只需要遍历一遍数组即可求得答案。
空间复杂度:O(1)O(1)O(1)。我们只需要常数空间存放若干变量。

方法二   分治法

struct Status {int lSum, rSum, mSum, iSum;
};struct Status pushUp(struct Status l, struct Status r) {int iSum = l.iSum + r.iSum;int lSum = fmax(l.lSum, l.iSum + r.lSum);int rSum = fmax(r.rSum, r.iSum + l.rSum);int mSum = fmax(fmax(l.mSum, r.mSum), l.rSum + r.lSum);return (struct Status){lSum, rSum, mSum, iSum};
};struct Status get(int* a, int l, int r) {if (l == r) {return (struct Status){a[l], a[l], a[l], a[l]};}int m = (l + r) >> 1;struct Status lSub = get(a, l, m);struct Status rSub = get(a, m + 1, r);return pushUp(lSub, rSub);
}int maxSubArray(int* nums, int numsSize) {return get(nums, 0, numsSize - 1).mSum;
}

总结

「方法二」相较于「方法一」来说,时间复杂度相同,但是因为使用了递归,并且维护了四个信息的结构体,运行的时间略长,空间复杂度也不如方法一优秀,而且难以理解。那么这种方法存在的意义是什么呢?

对于这道题而言,确实是如此的。但是仔细观察「方法二」,它不仅可以解决区间 [0,n−1][0, n-1][0,n−1],还可以用于解决任意的子区间 [l,r][l,r][l,r] 的问题。如果我们把 [0,n−1][0, n-1][0,n−1] 分治下去出现的所有子区间的信息都用堆式存储的方式记忆化下来,即建成一颗真正的树之后,我们就可以在 O(log⁡n)O(\log n)O(logn) 的时间内求到任意区间内的答案,我们甚至可以修改序列中的值,做一些简单的维护,之后仍然可以在 O(log⁡n)O(\log n)O(logn) 的时间内求到任意区间内的答案,对于大规模查询的情况下,这种方法的优势便体现了出来。这棵树就是上文提及的一种神奇的数据结构——线段树。

剑指 Offer 42. 连续子数组的最大和(官解)相关推荐

  1. 【LeetCode】剑指 Offer 42. 连续子数组的最大和

    [LeetCode]剑指 Offer 42. 连续子数组的最大和 文章目录 [LeetCode]剑指 Offer 42. 连续子数组的最大和 一.动态规划 一.动态规划 状态定义 设动态规划列表 dp ...

  2. LeetCode -- 剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 线性 DP 题. 针对于数组nums[i] 而言,以它为结尾的子数组分两种情况:(题目限制:必须是连续数组) num[i] 自身作为独立子数组:f[i] ...

  3. 剑指 Offer 42. 连续子数组的最大和

    摘要 剑指 Offer 42. 连续子数组的最大和 一. 动态规划分析 1.1 动态规划思路分析 假设nums数组的长度是n,下标从0到n−1.我们用 f(i)代表以第i个数结尾的连续子数组的最大和, ...

  4. 【最佳解法】剑指 Offer 42. 连续子数组的最大和

    我是小张同学,立志用最简洁的代码做最高效的表达 思路:动态规划 假设nums\textit{nums}nums 数组的长度是 nnn,下标从 000 到 n−1n-1n−1. 我们用 f(i)f(i) ...

  5. Leetcode 剑指 Offer 42. 连续子数组的最大和 (每日一题 20211014)

    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 ...

  6. leetcode剑指 Offer 42. 连续子数组的最大和(动态规划)

    输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,2 ...

  7. 剑指 Offer 42. 连续子数组的最大和java

    输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出 ...

  8. 【算法】剑指 Offer 42. 连续子数组的最大和 【重刷】

    1.概述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为O(n). 示例1: 输入: nums = [-2,1,-3,4,-1,<

  9. 剑指offer:连续子数组的最大和

    题目描述 小米2020届笔试题 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很 ...

最新文章

  1. FxCop的一些规范建议
  2. .NET全栈开发工程师学习路径
  3. 实录分享 | 计算未来轻沙龙:自然语言处理前沿研讨会
  4. 【Qt】Qt5.12版本编译Oracle驱动教程
  5. Flask的jinja输出json内容
  6. hibernate annotation注解方式来处理映射关系
  7. 读取properties资源文件中的参数
  8. English trip EM2-PE 5B Presentation yourself favorite food Teacher:Ashley
  9. 转:关于Apache与Nginx的优势比较(经典)
  10. win7计算机地址栏在那,win7系统如何使用地址栏功能|win7系统使用地址栏的方法...
  11. 壁纸小程序云开发+无限裂变+附安装视频教程
  12. 如何解决Mac电脑没声音了的问题
  13. STM32-DMA控制器
  14. 软件安全开发 - 流程规范
  15. Gallery 简易图片浏览
  16. 电脑艺术设计是否属计算机专业,电脑艺术设计属于计算机专业吗
  17. 一文学会网络分析——Co-occurrence网络图在R中的实现
  18. 鸿蒙应用开发 | 文本框(Text)和编辑框(TextField)的功能与用法
  19. arduino蜂鸣器控制
  20. QT设置背景图片的Qss实现方式

热门文章

  1. 社会兼职工作实践报告
  2. 2014下半年成长总结
  3. UI设计师必备10大工具
  4. 一张表格搞懂那些特殊的IP地址
  5. 高斯约当法矩阵求逆(Matlab实现)
  6. ansys_lsdyna输出.k文件lsprepost输出部件加速度
  7. js将base64图片处理成背景透明png
  8. python从文件中读数据并进行排序
  9. ARM处理器9种基本寻址方式,和单片机微机原理寻址方式截然不同,(例如没有直接地址寻址,只能间接指针寻址或者寄存器变址寻址,立即数寻址,不是所有立即数都可直接寻址)不可套用理解。需独立学习
  10. 引领办公大趋势 2017年度办公产品评奖