持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
一、题目描述:
给你一个整数数组 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
二、思路分析:
1、数组中的每一个数,单独满足平滑下降;
2、数组中连续几个数(>=2)满足后一个数比前一个数少1;
我们可以采用动态规划的思想:
(1)dp[i]:表示从第一天prices[0]到当前天prices[i]满足平滑下降阶段的总数目
(2)初始化,dp[0]=1,即第一天满足条件的只有这一天股票价格本身
(3)递推公式:dp[i]=dp[i-1]+1+num-1,其中:
+1,表示当前天单独满足平滑下降,所以计算当前满足的平滑下降总数目在dp[i-1]的基础上,先加上当前天单独满足的情况;
num-1,表示从dp[i-1]到dp[i]满足prices[i]+1==prices[i-1]条件的总的有num个数值,那么从dp[i-1]到dp[i]增加的满足条件的数目为num-1
(4) 当出现prices[i]+1 != prices[i-1]时,说明prices[i]已经不满足和前面部分的平滑下降,和前面断开,那么此时的dp[i]=dp[i-1]+1
同时,prices数组中可能还会在后半部分出现满足平滑下降的数据段,故我们需要把计数标志num重置为1,当后续再次出现满足平滑下降的情况时,便可重复(1,2,3).
三、AC 代码:
class Solution {
public long getDescentPeriods(int[] prices) {//注意prices中可能出现多段满足平滑下降的数据段,不连续
int num=1;//统计每个平滑下降数据段的长度
int len = prices.length;
long[] dp = new long[len];
dp[0]=1;
for(int i=1;i<len;i++){
if(prices[i]+1==prices[i-1]){
num++;
dp[i]=dp[i-1]+1+num-1;
}
if(prices[i]+1 != prices[i-1]){
num=1;
dp[i] = dp[i-1]+1+0;
}
}
return dp[len-1];
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做