Formatted question description: https://leetcode.ca/all/2012.html

2012. Sum of Beauty in the Array (Medium)

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 all 0 <= j < i and for all i < 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

Similar Questions:

Solution 1.

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/
// 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;
    }
};

All Problems

All Solutions