力扣2012题:双指针解法详解

一、题目解读
力扣2012题要求计算数组中每个元素的"美丽值"总和。美丽值判定规则:
若元素严格大于左侧所有元素且严格小于右侧所有元素,得2分
若仅满足大于左邻元素且小于右邻元素,得1分
其余情况不得分
二、解题思路
通过左右双指针预处理技术:
左数组预处理:存储每个位置左侧最大值
右数组预处理:存储每个位置右侧最小值
并行校验:同时检查两种美丽值条件 该方法将O(n²)暴力解法优化为O(n)时间复杂度,空间复杂度O(n)
三、解题步骤拆解
初始化左右辅助数组
从左到右遍历构建left_max数组
从右到左遍历构建right_min数组
中间元素双重条件判断:
先校验严格大于左侧所有且小于右侧所有(2分条件)
再校验简单递增关系(1分条件)
四、完整代码实现
class Solution {
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 res = 0;
// 计算每个中间元素的美丽值
for (int i = 1; i < n-1; ++i) {
if (left_max[i-1] < nums[i] && nums[i] < right_min[i+1]) {
res += 2;
} else if (nums[i-1] < nums[i] && nums[i] < nums[i+1]) {
res += 1;
}
}
return res;
}
};五、算法总结
该解法展现了数组预处理技术的典型应用:
原创内容 转载请注明出处
