You are given an integer array prices
representing the daily price history of a stock, where prices[i]
is the stock price on the ith
day.
A smooth descent period of a stock consists of one or more contiguous days such that the price on each day is lower than the price on the preceding day by exactly 1
. The first day of the period is exempted from this rule.
Return the number of smooth descent periods.
Example 1:
Input: prices = [3,2,1,4] Output: 7 Explanation: There are 7 smooth descent periods: [3], [2], [1], [4], [3,2], [2,1], and [3,2,1] Note that a period with one day is a smooth descent period by the definition.
Example 2:
Input: prices = [8,6,7,7] Output: 4 Explanation: There are 4 smooth descent periods: [8], [6], [7], and [7] Note that [8,6] is not a smooth descent period as 8 - 6 ≠ 1.
Example 3:
Input: prices = [1] Output: 1 Explanation: There is 1 smooth descent period: [1]
Constraints:
1 <= prices.length <= 105
1 <= prices[i] <= 105
Similar Questions:
Get the length of each segment that A[i] == A[i-1] - 1
. If a segment is of length len
, then it contributes 1 + 2 + 3 + ... + len = (1 + len) * len / 2
subarrays into the answer. For example [3,2,1]
has [3,2,1]
(1 array of length 3), [3,2]
, [2,1]
(2 arrays of length 2), [3]
, [2]
, [1]
(3 arrays of length 1), in total 1 + 2 + 3 = 6
valid subarrays.
// OJ: https://leetcode.com/problems/number-of-smooth-descent-periods-of-a-stock/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(1)
class Solution {
public:
long long getDescentPeriods(vector<int>& A) {
long long ans = 0, N = A.size();
for (long long i = 0; i < N; ) {
long long len = 1;
++i;
while (i < N && A[i] == A[i - 1] - 1) ++i, ++len;
ans += (1 + len) * len / 2;
}
return ans;
}
};