leetcode做题笔记42

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例:

输入:height = [4,2,0,3,2,5]
输出:9

目录

思路一:找最高峰,算出左右两边的水量之和

分析:

总结:


思路一:找最高峰,算出左右两边的水量之和

int trap(int* height, int heightSize){
    int i = 0;
    int max_index = 0, max = 0;
    int water_lvl = 0;
    int ans = 0;
    for ( i = 0; i < heightSize; i++)
    {
        if(height[i] > max)
        {
            max_index = i;
            max = height[i];
        }
    }
    water_lvl = 0;
    for ( i = 0; i < max_index; i++)
    {
        if(height[i] > water_lvl)
        {
            water_lvl = height[i];
        }
        ans += water_lvl - height[i];
    }
    water_lvl = 0;
    for(i = heightSize - 1; i > max_index ; i--)
    {
        if(height[i] > water_lvl)
        {
            water_lvl = height[i];
        }
        ans += water_lvl - height[i];
    }

    return ans;
}

时间复杂度O(n),空间复杂度O(1)

分析:

本题想到先找到最高峰,由于水量需要两个高度相近的柱子来存放,从两边由小到大的柱子高度递增将水量累加起来。水量等于低柱子的高度减去该位置柱子高度,若该位置柱子高度高于原低柱子,则将柱子高度换为该位置柱子高度。两边相加输出结果

总结:

该题主要考察了对实际问题的应用,本质上还是对数组的灵活应用。

你可能感兴趣的:(数组的应用,leetcode,笔记,算法)