To efficiently check if all elements to the left are less and all to the right are greater, precompute prefix maximums and suffix minimums. This allows constant-time checks for the beauty-2 condition. The beauty-1 condition is checked directly.
classSolution {
public:int sumOfBeauties(vector<int>& nums) {
int n = nums.size();
vector<int> left_max(n), right_min(n);
left_max[0] = nums[0];
for (int i =1; i < n; ++i) left_max[i] = max(left_max[i-1], nums[i]);
right_min[n-1] = nums[n-1];
for (int i = n-2; i >=0; --i) right_min[i] = min(right_min[i+1], nums[i]);
int ans =0;
for (int i =1; i < n-1; ++i) {
if (left_max[i-1] < nums[i] && nums[i] < right_min[i+1]) ans +=2;
elseif (nums[i-1] < nums[i] && nums[i] < nums[i+1]) ans +=1;
}
return ans;
}
};
classSolution {
publicintsumOfBeauties(int[] nums) {
int n = nums.length;
int[] leftMax =newint[n], rightMin =newint[n];
leftMax[0]= nums[0];
for (int i = 1; i < n; i++) leftMax[i]= Math.max(leftMax[i-1], nums[i]);
rightMin[n-1]= nums[n-1];
for (int i = n-2; i >= 0; i--) rightMin[i]= Math.min(rightMin[i+1], nums[i]);
int ans = 0;
for (int i = 1; i < n-1; i++) {
if (leftMax[i-1]< nums[i]&& nums[i]< rightMin[i+1]) ans += 2;
elseif (nums[i-1]< nums[i]&& nums[i]< nums[i+1]) ans += 1;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
classSolution {
funsumOfBeauties(nums: IntArray): Int {
val n = nums.size
val leftMax = IntArray(n)
val rightMin = IntArray(n)
leftMax[0] = nums[0]
for (i in1 until n) leftMax[i] = maxOf(leftMax[i-1], nums[i])
rightMin[n-1] = nums[n-1]
for (i in n-2 downTo 0) rightMin[i] = minOf(rightMin[i+1], nums[i])
var ans = 0for (i in1 until n-1) {
if (leftMax[i-1] < nums[i] && nums[i] < rightMin[i+1]) ans +=2elseif (nums[i-1] < nums[i] && nums[i] < nums[i+1]) ans +=1 }
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution:
defsumOfBeauties(self, nums: list[int]) -> int:
n = len(nums)
left_max = [0] * n
right_min = [0] * n
left_max[0] = nums[0]
for i in range(1, n):
left_max[i] = max(left_max[i-1], nums[i])
right_min[-1] = nums[-1]
for i in range(n-2, -1, -1):
right_min[i] = min(right_min[i+1], nums[i])
ans =0for i in range(1, n-1):
if left_max[i-1] < nums[i] < right_min[i+1]:
ans +=2elif nums[i-1] < nums[i] < nums[i+1]:
ans +=1return ans