news 2026/9/2 21:28:52

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/9/1 9:48:07

【一句话概述】Webpack、Vite、Rollup 核心区别

Webpack、Vite、Rollup 核心区别概述 一句话概述 Webpack 是全能型构建工具&#xff0c;Vite 是新时代开发体验的颠覆者&#xff0c;Rollup 是专注高效的库打包专家。 Webpack 核心理念&#xff1a;基于依赖图的静态打包器 构建方式&#xff1a;开发/生产环境都需全量打包&…

作者头像 李华
网站建设 2026/9/1 12:32:03

【一句话概括】Vue2 和 Vue3 的 diff 算法区别

一句话概括Vue2 和 Vue3 的 diff 算法区别 Vue2 和 Vue3 的 diff 算法核心区别在于 优化策略和数据粒度&#xff0c;Vue3 通过编译时优化实现了更精确的靶向更新。 Vue2 的 diff 算法&#xff08;双端比较&#xff09; 递归同层比较&#xff1a;深度优先&#xff0c;逐层比较…

作者头像 李华
网站建设 2026/9/1 22:42:13

【一句话概括】前端项目包管理器怎么选?

一句话总结&#xff1a;npm 是生态广泛的默认选项&#xff0c;yarn 侧重团队协作的确定性&#xff0c;pnpm 以磁盘效率和严格隔离见长&#xff0c;而 bun 则是追求极致性能的一体化新锐。 这里简要概述了 npm、yarn、pnpm 和 bun 这四种主流 JavaScript 包管理器的核心区别。工…

作者头像 李华
网站建设 2026/9/2 11:05:53

HuggingFace镜像网站上如何获取Qwen3-14B模型权重?

如何高效获取 Qwen3-14B 模型权重&#xff1a;从镜像加速到本地部署的完整实践 在大模型落地日益加速的今天&#xff0c;一个常见的现实问题是&#xff1a;为什么我已经选好了理想的模型&#xff0c;却卡在了“下载”这一步&#xff1f; 比如你打算在企业内网部署通义千问系列…

作者头像 李华
网站建设 2026/9/2 0:42:55

C4D 的模拟能力真的那么差吗?——Houdini 与 Cinema 4D 模拟对比分析

原创声明&#xff1a;本文为原创内容&#xff0c;转载请注明出处。所有观点和分析均基于个人经验及公开资料&#xff0c;旨在为学习者和专业人士提供参考。3D 动画制作领域&#xff0c;尤其是在物理模拟的应用上&#xff0c;Cinema 4D&#xff08;C4D&#xff09;与 Houdini 的…

作者头像 李华