2012-数组美丽值求和

Raphael Liu Lv10

给你一个下标从 0 开始的整数数组 nums 。对于每个下标 i1 <= i <= nums.length - 2),nums[i]美丽值 等于:

  • 2,对于所有 0 <= j < ii < k <= nums.length - 1 ,满足 nums[j] < nums[i] < nums[k]
  • 1,如果满足 nums[i - 1] < nums[i] < nums[i + 1] ,且不满足前面的条件
  • 0,如果上述条件全部不满足

返回符合 1 <= i <= nums.length - 2 的所有 __nums[i] __ 的 美丽值的总和

示例 1:

**输入:** nums = [1,2,3]
**输出:** 2
**解释:** 对于每个符合范围 1 <= i <= 1 的下标 i :
- nums[1] 的美丽值等于 2

示例 2:

**输入:** nums = [2,4,6,4]
**输出:** 1
**解释:** 对于每个符合范围 1 <= i <= 2 的下标 i :
- nums[1] 的美丽值等于 1
- nums[2] 的美丽值等于 0

示例 3:

**输入:** nums = [3,2,1]
**输出:** 0
**解释:** 对于每个符合范围 1 <= i <= 1 的下标 i :
- nums[1] 的美丽值等于 0

提示:

  • 3 <= nums.length <= 105
  • 1 <= nums[i] <= 105

思想
前缀和思想。题目2012. 数组美丽值求和好像接雨水的挡板问题,美丽值就是左边最大值比自己小,右边最小值比自己大

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int sumOfBeauties(vector<int>& nums) {
int n = nums.size();
vector<int> l_max(n, INT_MIN); l_max[0] = nums[0]; // 某元素左边最大元素
vector<int> r_min(n, INT_MAX); r_min[n-2] = nums[n-1]; // 某元素右边最小元素
for (int i = 1; i < n; ++i) {
l_max[i] = max( l_max[i-1], nums[i-1] );
}
for (int i = n-2; i >= 0; --i) {
r_min[i] = min( r_min[i+1], nums[i+1] );
}
int ans = 0;
for (int i = 1; i < n-1; ++i) {
if (nums[i] > l_max[i] && nums[i] < r_min[i]) ans += 2;
else if (nums[i] > nums[i-1] && nums[i] < nums[i+1]) ++ans;
}
return ans;
}
};
 Comments
On this page
2012-数组美丽值求和