Leetcode.901 股票价格跨度

题目信息

LeetoCode地址: . - 力扣(LeetCode)

题目理解

价格跨度的定义在题目中很明确,就是韭菜持有一只股票且该股票保持连续上涨最大的天数。

直观的想,我们可以保存第一天到当前天的所有股价,并一天一天往前找单调递减的连续天数。

但是考虑这样一个股价序列, 1,2,3,4,5,6,7,在计算6和7的股价跨度时,会存在大量的重复计算。

因为计算7的跨度时候,需要遍历到1,计算6的跨度时,也需要遍历到1。

让我们换一个思路。

假如后一天的股价比前一天小,则显然它的跨度就是1,此时我们需要将该天的股价和跨度缓存起来,因为后一天股价跨度的计算需要依赖它。

相反,假设后一天的股价比前一天大,显然它的跨度是之前所有的股价小于等于它的股价的跨度之和。

所以我们需要一个数据结构,当股价单调递减时,我们按照先后顺序缓存它们以及股价跨度1,一旦股价开始回升,我们就要从后向前从该数据结构中弹出所有更低股价的跨度,直到遇到一个更大的股价。相加的结果当然也要缓存进去,这显然就是一个栈,一个将单调递减数据连续入栈的单调栈。

这样处理的好处在于,没有任何计算是重复的,所有的跨度信息都被很好的保存,并在合适的时机删除(与更大的股价的跨度合并)。

单调栈写法

public class StockSpanner {Deque<int[]> stack;public StockSpanner() {stack = new LinkedList<>();}public int next(int price) {if (stack.isEmpty()) {stack.push(new int[]{price, 1});return 1;} else {if (stack.peek()[0] > price) {stack.push(new int[]{price, 1});return 1;}int[] newTop = new int[]{price, 1};while (!stack.isEmpty() && stack.peek()[0] <=price) {newTop[1] +=stack.pop()[1];}stack.push(newTop);return newTop[1];}}}

在股票价格列表的长度为l的前提下,

时间复杂度: O(l),最坏情况下,就是前l-1个股价都是单调递减的,最后一个股价高于它们,则计算它需要所有元素出栈。

额外空间复杂度:O(l),栈结构需要存储至多l-1个元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/706086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2-27练习

1、请用fscanf和fprintf实现文件拷贝。 &#xff08;fputc和fgetc&#xff09; #include <stdio.h> int main(int argc, const char *argv[]) {FILE* fp NULL;fp fopen("./z1.txt","r");//用fscanf统计文件大小int count 0;char c; // while(fs…

对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

从铺天盖地的市场消息来看&#xff0c;华为即将面世的鸿蒙NEXT系统已经势不可挡了 想必大家都已经迫不及待地想要进行尝试。 估计大家都有着同样的疑问&#xff1a; 会不会是下一个风口&#xff1f;转鸿蒙应用开发难吗&#xff1f; 会不会是下一个风口&#xff1f; 自从鸿蒙…

江科大stm32 定时器 TIM输出比较--学习笔记

这几天遇到输出比较相关的问题&#xff0c;于是来学习下TIM输出比较部分知识点&#xff01; 输出比较简介 CNT是计数器的值&#xff0c;CCR寄存器是捕获/ 比较寄存器 简单的讲&#xff0c;输出比较就是用来输出PWM波形。 PWM简介 占空比&#xff1a;高电平占一个周期的比例。…

搜索算法(算法竞赛、蓝桥杯)--双向BFS字串变换

1、B站视频链接&#xff1a;B19 双向BFS 字串变换_哔哩哔哩_bilibili 题目链接&#xff1a;[NOIP2002 提高组] 字串变换 - 洛谷 #include <iostream> #include <queue> #include <unordered_map> using namespace std;const int N7; int n; string A,B,a[N]…

opencascade c#例程解析

1.编译 将msvc.bat文件拖入vs2022的x64 native tools&#xff0c;即可 2.about.xaml <Windowxmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"x:Class"IE_WPF_WinForms…

前后端项目-part03

文章目录 5.4.4 机构名称5.4.4.1 创建实体类Company5.4.4.2 创建实体类CompanyMapper5.4.4.3 创建实体类CompanyService5.4.4.4 创建实体类CompanyController5.4.4.5 后端测试5.4.4.6 修改basic.js5.4.4.7 修改course.vue5.4.4.8 测试5.4.5 课程标签5.4.5.1 效果5.4.5.2 修改co…

后台管理系统: 权限管理

权限管理 角色:一家企业而言&#xff1a;BOSS、运维、销售、程序员 权限:超级管理员&#xff08;BOSS&#xff09;&#xff0c;是有权利操作整个项目的所有的模块 test&#xff08;新媒体&#xff09;&#xff0c;只能首页、商品管理者一部分菜单数据 admin&#xff1a;…

ClickHouse 指南(三)最佳实践 -- 主键稀疏索引

在ClickHouse主索引的实用介绍 ClickHouse release 24.1, 2024-01-30 1、简介 在本指南中&#xff0c;我们将深入研究ClickHouse索引。我们将详细说明和讨论: ClickHouse中的索引与传统的关系数据库管理系统有何不同ClickHouse是如何构建和使用表的稀疏主索引的什么是在Clic…

Curator基本使用

文章目录 1. 基本操作1.1 建立连接1.2 创建结点1.3 查询结点查询数据查询子结点查看结点信息 1.4 修改结点普通修改带乐观锁的修改 1.5 删除删除单个结点删除带子结点的结点必须成功的删除带回调函数的删除 2. 监听器事件2.1 NodeCache单一结点连续监听2.2 PathChildrenCache监…

nginx平滑升级,信号使用,分割日志

信号 kill -l 看信号大全 nginx -h 中可以看到的信号较少 s signal : send signal to a master process: stop, quit, reopen, reload 可以使用man手册来查看详细的信号 如果没安装&#xff0c;去源码包里找到man文件 man 路径/nginx.8 不加路径打不开man帮助 st…

docker小知识:linux环境安装docker

安装必要软件包&#xff0c;执行如下命令 yum install -y yum-utils device-mapper-persistent-data lvm2目的是确保在安装 Docker 之前&#xff0c;系统已经安装了必要的软件包和服务&#xff0c;以支持 Docker 的正常运行。设置yum源&#xff0c;添加Docker官方的CentOS存储…

javasript基础

1.HTML是网页的结构 css是网页的外观 而JavaScript是页面的行为 2.javascript支持吧静态页面(HTML)转换为支持用户交互并响应相应事件的动态页面 3.typeof&#xff08;&#xff09;返回当前操作数的数据类型 parseInt()将字符串转换为整型,parseFloat()将字符串转换为浮点型 …

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁&#xff0c;并引入了一个新的问题 若定义锁的过期时间是10s&#xff0c;此时A线程获取了锁然后执行业务代码&#xff0c;但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码&#xff0c;A线程…

【Redis】基本操作 - 安装与配置

文章目录 1. 安装Redis1.1 Ubuntu / Debian1.2 CentOS / RHEL1.3 macOS1.4 Windows 2. 启动和停止Redis2.1 Ubuntu / Debian2.2 CentOS / RHEL2.3 macOS2.4 Windows 3. 配置文件3.1 常见配置项 4. 修改配置文件5. 重启Redis5.1 Ubuntu / Debian5.2 CentOS / RHEL5.3 macOS5.4 W…

C语言统计成绩

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 问题描述 解决方案 总结 描述 输入n科成绩&#xff08;浮点数表示&#xff09;&#xff0c;统计其中的最高分&#xff0c;最低分以及平均分。 数据范围&#xff1a;1≤&#xfffd;≤100 1≤n≤100 &#xff0c; …

k8s Pod 进阶(资源限制,健康检查探针详解,启动退出,pod生命周期,)

目录 资源限制 查看资源控制字段 Pod 资源限制方式 Pod 和容器中定义资源请求和限制的具体字段 CPU资源单位 内存资源单位 示例 健康检查&#xff08;探针&#xff09; 探针的三种规则 存活探针&#xff08;Liveness Probe&#xff09; 就绪探针&#xff08;Readines…

thetwo--TO BE BETTER!!!

紧随上一篇&#xff0c;我们已经设置好了一些参数&#xff0c;下面我们来定义模型&#xff1a; 代码如下&#xff1a; import typing import tensorflow as tf import theone def get_vgg19_model(layers):"""初始化并创建vgg19模型:param layers::return:&qu…

vscode与vue/react环境配置

一、下载并安装VScode 安装VScode 官网下载 二、配置node.js环境 安装node.js 官网下载 会自动配置环境变量和安装npm包(npm的作用就是对Node.js依赖的包进行管理)&#xff0c;此时可以执行 node -v 和 npm -v 分别查看node和npm的版本号&#xff1a; 配置系统变量 因为在执…

机器学习:朴素贝叶斯算法(Python)

一、朴素贝叶斯算法的实现 naive_bayes_classifier.py import numpy as np import collections as cc # 集合的计数功能 from scipy.stats import norm # 极大似然估计样本的均值和标准方差 from data_bin_wrapper import DataBinsWrapperclass NaiveBayesClassifier:"…

Python分支和循环结构及其应用(文末送书)

一、分支结构 应用场景 我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。 if语句的使用 在Python中&#xff0c;要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的…