42. 接雨水

题目描述

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


42. 接雨水_第1张图片
image

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

解题思路

每个柱子可接的水量 = min(左边柱子高度,右边柱子高度) 与当前柱子高度的差。当然最左、最右柱子不可以接水。
所以可以定义两个数组left和right,分别存储i左边柱子的最大高度、i右边柱子的最大高度。

int trap(vector& height){
    int length = height.size();
    if(length < 1)
        return 0;

    vector left(length, 0);
    vector right(length, 0);

    int max_left = height[0];
    for(int i=1; i=0; j--){
        if(max_right

更优解:双指针法,不需要设定left数组和right数组,仅保留max_left和max_right。这是因为计算每个位置的水量时,仅需要知道一边最小的高度就好。

  • 当当前左边界<右边界,收集left处的水,左边界++
  • 当当前左边界>有边界,收集right处的水,右边界--
    int trap(vector& height) {
        int length = height.size();
        if(length<1)
            return 0;

        // max_left, 当前左边最大高度;max_right,当前右边最大高度
        int max_left = height[0], max_right = height[length-1];
        // left,当前左边收集下标;right,当前右边收集下标
        int left = 1, right = length - 2;
        int ret = 0;
        for(int i=1; i

你可能感兴趣的:(42. 接雨水)