| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Leetcode 1124. 表现良好的最长时间段 -> 正文阅读 |
|
[数据结构与算法]Leetcode 1124. 表现良好的最长时间段 |
1.题目链接?Leetcode1124?2.题目描述?3.思路? ? 这道题在leetcode上面的思路,基本上是使用前缀和+暴力求解,或者是前缀和+单调栈,这两种方法都有理解的前置要求,得先知道前缀和以及单调栈是什么。下面我来介绍一下,搞懂了这两个是什么,有什么用,理解起来就不难了。 ? ?3.1前缀和? ? ?前缀和,即preSum,其实就是从数组中的第 0 位置开始累加,到第?i位置的累加结果,我们常把这个结果保存到数组?
? ?从公式中可以看出,前缀和这种计算方式巧妙地利用了以前计算出的结果,比如要计算preSum[3],只需要知道preSum[2]以及nums[3]即可,因为preSum[2]已经保存了从nums[0]到nums[2]相加的结果。 ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图1-1 前缀和求解过程 ? ?我们常常把「前缀和」数组? ? 那么就可以把? ? 3.2前缀和的作用
? ? ? ? ? ?? ? ? ? ? ?原理其实很好理解,比如要计算nums[2]到nums[4]的元素和,根据preSum的公式其实就是用preSum[5] - preSum[2]即可,因为preSum[5]是下标0->4的元素和,preSum[2]是下标0->1的元素和,0->4的元素和减去0->1的元素和就剩下2->4的元素和,即我们要求的。 3.3单调栈? ?单调栈的概念非常容易,其实就是栈内的元素严格单调递增或者递减,就是单调栈。这个的作用后面再说我们看看怎么求。? ?
? 这个一个单调递减栈,从代码中不难看出,如果以栈的栈顶元素为下标,那么其实就是找preSum中比以栈顶元素为下标的preSum元素小的元素的下标入栈。? 3.4本题解题步骤?
? ? ? ? ?? ? ? ? 到这里我们其实就是要求,使这个sum(i,j)最大的i,j是什么,到这里有两个办法,一个是暴力解法。也就是用双重循环遍历preSum数组,定义一个max变量,遍历过程中不断判断,如果preSum[j]-preSum[i]>0,也就是大于八小时的天数比小于八小时的天数多,就更新为max,遍历结束后,最大的区间和也就求出来了,此题也就解出来了。 ??
? ? ?另一种办法则是用上面提到的单调栈?,这里用了单减栈,即栈内元素严格递减的栈,?也就是说这个栈中的元素(也就是下标)对应在preSum数组中都是小于等于0的,也就是首先固定了preSum[j] - preSum[i] >0这个表达式中preSum[i]的部分,因为preSum[i]现在都是小于等于0的,要使preSum[j] - preSum[i]尽量大,那么preSum[i]就要尽量小。 ? ?
?至此,本题结束。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:44:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |