当前位置:首页 > 力扣题解 > 力扣2012题:双指针解法详解

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

1周前 (08-16)力扣题解67

截图未命名.jpg 力扣2012题:双指针解法详解 力扣题解 双指针 C++ 第1张

一、题目解读

力扣2012题要求计算数组中每个元素的"美丽值"总和。美丽值判定规则:

  • 若元素严格大于左侧所有元素且严格小于右侧所有元素,得2分

  • 若仅满足大于左邻元素且小于右邻元素,得1分

  • 其余情况不得分

二、解题思路

通过左右双指针预处理技术:

  1. 左数组预处理:存储每个位置左侧最大值

  2. 右数组预处理:存储每个位置右侧最小值

  3. 并行校验:同时检查两种美丽值条件 该方法将O(n²)暴力解法优化为O(n)时间复杂度,空间复杂度O(n)

三、解题步骤拆解

  1. 初始化左右辅助数组

  2. 从左到右遍历构建left_max数组

  3. 从右到左遍历构建right_min数组

  4. 中间元素双重条件判断

    • 先校验严格大于左侧所有且小于右侧所有(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;
    }
};

五、算法总结

该解法展现了数组预处理技术的典型应用:

原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。