You are given a 0-indexed integer array nums
. For each index i
(1 <= i <= nums.length - 2
) the beauty of nums[i]
equals:
2
, ifnums[j] < nums[i] < nums[k]
, for all0 <= j < i
and for alli < k <= nums.length - 1
.1
, ifnums[i - 1] < nums[i] < nums[i + 1]
, and the previous condition is not satisfied.0
, if none of the previous conditions holds.
Return the sum of beauty of all nums[i]
where 1 <= i <= nums.length - 2
.
Example 1:
Input: nums = [1,2,3] Output: 2 Explanation: For each index i in the range 1 <= i <= 1: - The beauty of nums[1] equals 2.
Example 2:
Input: nums = [2,4,6,4] Output: 1 Explanation: For each index i in the range 1 <= i <= 2: - The beauty of nums[1] equals 1. - The beauty of nums[2] equals 0.
Example 3:
Input: nums = [3,2,1] Output: 0 Explanation: For each index i in the range 1 <= i <= 1: - The beauty of nums[1] equals 0.
Constraints:
3 <= nums.length <= 105
1 <= nums[i] <= 105
Similar Questions:
Intuition: Let left[i]
be the greatest value in A[0..i]
, and right[i]
be the smallest value in A[i..(N-1)]
. For the first condition, we just need to check if A[i] > left[i - 1] && A[i] < right[i + 1]
.
Algorithm:
We can precompute the right
array and then compute left
on the fly.
// OJ: https://leetcode.com/problems/sum-of-beauty-in-the-array/
// Author: github.com/lzl124631x
// Time: O(N)
// Space: O(N)
class Solution {
public:
int sumOfBeauties(vector<int>& A) {
int N = A.size(), left = A[0], ans = 0;
vector<int> right(N, A[N - 1]);
for (int i = N - 2; i > 0; --i) right[i] = min(right[i + 1], A[i]);
for (int i = 1; i < N - 1; ++i) {
if (A[i] > left && A[i] < right[i + 1]) ans += 2;
else if (A[i] > A[i - 1] && A[i] < A[i + 1]) ans++;
left = max(left, A[i]);
}
return ans;
}
};