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, if nums[j] < nums[i] < nums[k], for all0 <= j < i and for alli < k <= nums.length - 1.
1, if nums[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
Solutions
Solution 1: Preprocessing Right Minimum + Traversing to Maintain Left Maximum
Thinking
With \(n \le 10^5\), rescanning left/right extrema per \(i\) is quadratic. Beauty \(2\) needs \(nums[i]\) strictly above every left value and below every right value; beauty \(1\) only looks at neighbors.
Suffix minima \(right[i]\) are precomputed; a running \(l\) tracks the left maximum.
Each middle index first tests \(l < nums[i] < right[i+1]\) for \(2\), else the adjacent triple for \(1\).
We can preprocess the right minimum array \(right\), where \(right[i]\) represents the minimum value in \(nums[i..n-1]\).
Then we traverse the array \(nums\) from left to right, while maintaining the maximum value \(l\) on the left. For each position \(i\), we judge whether \(l < nums[i] < right[i + 1]\) holds. If it does, we add \(2\) to the answer. Otherwise, we judge whether \(nums[i - 1] < nums[i] < nums[i + 1]\) holds. If it does, we add \(1\) to the answer.
After the traversal, we can get the answer.
The time complexity is \(O(n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the array \(nums\).