直方图的水量,(三指针)

Posted ascto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直方图的水量,(三指针)相关的知识,希望对你有一定的参考价值。

给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。

class Solution 
 public int trap(int[] height) 
        int len = height.length;

        int left = 0, right = 1; // 左右区间指针
        int recordIndex = -1; // 记录当前遍历的区间里递增段中终最大元素位置
        int result = 0;
        while (right < len)
            if (height[right - 1] < height[right]) // 开始递增了
                if (height[right] >= height[left]) // 如果当前的元素大于左边界的,直接计算水量
                    result += calcSave(height, left, right);

                    // 更新位置
                    left = right;
                    recordIndex = -1;
                else if (recordIndex == -1 || height[right] >= height[recordIndex])
                    recordIndex = right; // 记录递增的值
                
            

            if (right == len - 1 && recordIndex != -1)
                right = recordIndex;
                result += calcSave(height, left, right);

                // 更新位置
                left = right;
                recordIndex = -1;
            

            right++;
        

        return result;
    
    public int calcSave(int[] height, int left, int right)
        // 当前左右区间中值小的那个
        int curMinHeight = Math.min(height[left], height[right]);

        // 计算当前区间,应该减掉的实体
        int curHeightSum = 0;
        if (curMinHeight != 0)
            for (int i = left + 1; i < right; i++)
                if (height[i] >= curMinHeight)
                    curHeightSum += curMinHeight;
                else 
                    curHeightSum += height[i];
                
            
        

        return ((right - left - 1) * curMinHeight - curHeightSum);
    


以上是关于直方图的水量,(三指针)的主要内容,如果未能解决你的问题,请参考以下文章

算法之双指针(共同点:核心逻辑思路:即先找到比较小的区域(例如决定了存水量),然后在比较小的区域中找到一个最大值))~盛最多水的容器~~~接雨水

降水量分级

Honk's pool(二分模板题)

2021春季每日一题week3 未完结

降水量与蒸发量统计报表详细注释

华为OD机试真题 C++ 实现水库蓄水问题2022.11 Q4 新题