news 2026/2/17 7:28:39

LeetCode 2110.股票平滑下跌阶段的数目:数学(一次遍历)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 2110.股票平滑下跌阶段的数目:数学(一次遍历)

【LetMeFly】2110.股票平滑下跌阶段的数目:数学(一次遍历)

力扣题目链接:https://leetcode.cn/problems/number-of-smooth-descent-periods-of-a-stock/

给你一个整数数组prices,表示一支股票的历史每日股价,其中prices[i]是这支股票第i天的价格。

一个平滑下降的阶段定义为:对于连续一天或者多天,每日股价都比前一日股价恰好少1,这个阶段第一天的股价没有限制。

请你返回平滑下降阶段的数目。

示例 1:

输入:prices = [3,2,1,4]输出:7解释:总共有 7 个平滑下降阶段: [3], [2], [1], [4], [3,2], [2,1] 和 [3,2,1] 注意,仅一天按照定义也是平滑下降阶段。

示例 2:

输入:prices = [8,6,7,7]输出:4解释:总共有 4 个连续平滑下降阶段:[8], [6], [7] 和 [7] 由于 8 - 6 ≠ 1 ,所以 [8,6] 不是平滑下降阶段。

示例 3:

输入:prices = [1]输出:1解释:总共有 1 个平滑下降阶段:[1]

提示:

  • 1 <= prices.length <= 105
  • 1 <= prices[i] <= 105

解题方法:遍历

假设有3 33连续下滑天[ 3 , 2 , 1 ] [3, 2, 1][3,2,1],那么可以有3 , 2 , 1 3, 2, 13,2,1(连续3天共1种)、3 , 2 3, 23,22 , 1 2, 12,1(连续2天共2种)、3 332 221 11(连续1天共3种)这共计1 + 2 + 3 = 3 ( 3 + 1 ) 2 = 6 1+2+3=\frac{3(3+1)}{2}=61+2+3=23(3+1)=6平滑下降阶段

同样的,n nn连续下滑天就有n ( n + 1 ) 2 \frac{n(n+1)}22n(n+1)平滑下降阶段

因此,我们只需要遍历一遍,看下原始数组中有多少连续下滑天,并将每个连续下滑天的平滑下降阶段种类数求和即可。

具体做法

具体而言,可以使用两个变量:l a s t lastlastc n t cntcnt分别记录上一天的价格和当前连续下滑天,遇到连续下滑天中断的情况就计算一次a n s ansans,最后返回前也计算一次a n s ansans

时空复杂度

  • 时间复杂度O ( l e n ( p r i c e s ) ) O(len(prices))O(len(prices))
  • 空间复杂度O ( 1 ) O(1)O(1)

AC代码

C++
/* * @LastEditTime: 2025-12-15 18:52:23 */typedeflonglongll;classSolution{public:llgetDescentPeriods(vector<int>&prices){ll ans=0,cnt=0;intlast=0;for(intt:prices){if(t!=last-1){ans+=cnt*(cnt+1)/2;// printf("t = %d, cnt = %lld\n", t, cnt);cnt=0;}last=t;cnt++;}returnans+cnt*(cnt+1)/2;}};
Python
''' LastEditTime: 2025-12-15 18:54:39 '''fromtypingimportListclassSolution:defgetDescentPeriods(self,prices:List[int])->int:ans=last=cnt=0forpinprices:ifp!=last-1:ans+=cnt*(cnt+1)//2cnt=0cnt+=1last=preturnans+cnt*(cnt+1)//2
Java
/* * @LastEditTime: 2025-12-15 21:37:22 */classSolution{publiclonggetDescentPeriods(int[]prices){longans=0,cnt=0;for(intlast=0,i=0;i<=prices.length;i++){if(i==prices.length||prices[i]!=last-1){ans+=cnt*(cnt+1)/2;cnt=0;}cnt++;if(i<prices.length){last=prices[i];}}returnans;}}
Go
/* * @LastEditTime: 2025-12-15 21:35:08 */packagemainfuncgetDescentPeriods(prices[]int)(ansint64){varcntint64last:=0fori:=0;i<=len(prices);i++{ifi==len(prices)||prices[i]!=last-1{ans+=cnt*(cnt+1)/2cnt=0}cnt++ifi<len(prices){last=prices[i]}}return}
Rust
/* * @LastEditTime: 2025-12-15 21:41:17 */implSolution{pubfnget_descent_periods(prices:Vec<i32>)->i64{letmutans:i64=0;letmutcnt:i64=0;letmutlast:i32=0;forpinprices{// 一借不还ifp!=last-1{ans+=cnt*(cnt+1)/2;cnt=0;}cnt+=1;last=p;}ans+cnt*(cnt+1)/2}}

End

今天跌得可不轻啊

The Real End, Thanks!

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/13 16:41:53

智慧树学习助手:3分钟完成自动化学习配置的完整指南

智慧树学习助手&#xff1a;3分钟完成自动化学习配置的完整指南 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的冗长视频课程烦恼吗&#xff1f;手动…

作者头像 李华
网站建设 2026/2/13 21:49:32

Windows虚拟显示器完整教程:免费扩展你的数字工作空间

Windows虚拟显示器完整教程&#xff1a;免费扩展你的数字工作空间 【免费下载链接】virtual-display-rs A Windows virtual display driver to add multiple virtual monitors to your PC! For Win10. Works with VR, obs, streaming software, etc 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/2/16 3:48:25

Vue3低代码开发平台:3步搭建你的首个可视化应用

Vue3低代码开发平台&#xff1a;3步搭建你的首个可视化应用 【免费下载链接】vite-vue3-lowcode vue3.x vite2.x vant element-plus H5移动端低代码平台 lowcode 可视化拖拽 可视化编辑器 visual editor 类似易企秀的H5制作、建站工具、可视化搭建工具 项目地址: https://…

作者头像 李华
网站建设 2026/2/6 13:00:21

数据库迁移革命:从SQLite到MySQL的3分钟终极转换方案

数据库迁移革命&#xff1a;从SQLite到MySQL的3分钟终极转换方案 【免费下载链接】sqlite-to-mysql Script to convert and add sqlite3 database into a mysql/mariadb database 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-to-mysql 你是否曾经因为项目从小型…

作者头像 李华
网站建设 2026/2/13 8:41:21

结合.NET Aspire与Spring Boot:构建可观测的云原生Java应用

在云原生时代,即使是以.NET生态为核心的开发框架,也意识到了多语言支持的重要性。.NET Aspire便是这样一个框架,它虽然源于.NET,但通过其开放的设计,特别是对OpenTelemetry标准的采纳,为Java Spring Boot应用程序提供了强大的集成支持,使Java开发者也能受益于其简化的分…

作者头像 李华
网站建设 2026/2/3 22:36:34

verilog简单入门day7

今天我们先尝试一下debug这是代码块示意图这是原代码always (*) beginif (cpu_overheated)shut_off_computer 1; end always (*) beginif (~arrived)keep_driving ~gas_tank_empty; end可以发现这个代码无法实现图片功能&#xff0c;因此我们需要进行修改&#xff0c;有两个l…

作者头像 李华