[leetcode] Trapping Rain Water

来源:互联网 发布:25001端口 编辑:程序博客网 时间:2024/04/28 15:25

思路1:对某个值A[i]来说,能装的最多的水取决于在i之前最高的值leftMax[i]和在i右边的最高的rightMax[i],容水量即min(leftMax[i],rightMax[i]) – A[i]。:为了计算高度,第一遍从左到右计算数组leftMaxt,第二遍从右到左计算rightMax。时空复杂度都是O(n)。

int trap(int A[], int n) 
{
if(n == 0 || n == 1 || n==2)
return 0;
int *leftMax = new int[n];
int *rightMax = new int[n];
int area = 0;
int max;


max = A[0];
for(int i = 0; i < n; i++)
{

leftMax[i] = max;

if(A[i] > max)

max = A[i];
}
max = A[n-1];
for(int i = n-1; i >= 0; i--)
{
rightMax[i] = max;

if(A[i] > max)
max = A[i];
}
for(int i = 0; i < n; i++)
{
int h = min(leftMax[i], rightMax[i]);
if(A[i] < h)
area += h-A[i];
}
return area;
}

思路2:改进思路1,可以用常量空间搞定。具体思路,先找到最高的柱,设下标为maxIdx,然后由两边向中间计算,边计算边更新当前的最高高度。

    int trap(int A[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int water = 0;
        int maxIdx = 0;
        for (int i = 1; i < n; i++) {
            if (A[i] > A[maxIdx]) {
                maxIdx = i;
            }
        }
        int max = A[0];
        for (int i = 1; i < maxIdx; i++) {
            if (A[i] > max) {
                max = A[i];
            }
            else {
                water += max - A[i];
            }
        }
        max = A[n - 1];
        for (int i = n - 2; i > maxIdx; i--) {
            if (A[i] > max) {
                max = A[i];
            }
            else {
                water += max - A[i];
            }
        }
        return water;
    }

思路3:设置两个指针,一个从最左边开始遍历,一个从最右边开始遍历。只要两个指针不相遇,则从较低侧往中间遍历,当

堤坝高度小于或等于这个较低侧高度时,将高度差加到蓄水和。

int trap2(int A[], int n) 
{
if(n == 0 || n == 1 || n==2)
return 0;
int left = 0;
int right = n-1;
int area = 0;


int leftH = 0;
int rightH = 0;
while(left < right)
{
if(A[left] < A[right])
{
if(A[left] < leftH)
area += leftH - A[left];
else
leftH = A[left];
left++;
}
else
{
if(A[right] < rightH)
area += rightH - A[right];
else
rightH = A[right];
right--;
}
}
return area;
}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机的设置不在桌面了怎么办 华为手机所有应用都不在桌面怎么办 华为麦芒5设置页面不显示怎么办 华为麦芒5主屏页面不显示怎么办 6s p换屏幕原装太贵怎么办 4g手机开不开机黑屏怎么办 华为麦芒5 4g信号差怎么办 华为麦芒手机锁屏密码忘了怎么办 华为麦芒5相机拍相片倒了怎么办 红米5a开不了机怎么办 华为沾了海水打不开机怎么办 华为麦芒手机忘记锁屏密码怎么办 华为手机的方框键摁不了怎么办 笔记本自动更新到一半太慢了怎么办 华为麦芒5音量下键乱跑了怎么办 麦芒6手机QQ视频没声音怎么办 18:9看16:9黑边怎么办 华为畅享7s声音小怎么办 华为畅享8手机声音小怎么办 华为畅享8plus声音小怎么办 荣耀7x锁屏密码忘记怎么办 华为荣耀7x锁屏密码忘记了怎么办 苹果耳机进水后声音变了怎么办 华为荣耀开了数据用不了怎么办 华为手机高德地图信号弱怎么办? 手机QQ浏览器看视频有广告怎么办 手机显示网络连接但不可上网怎么办 华为手机关机后开不了机怎么办 华为畅享8p相机拍照模糊怎么办 手机触屏不准怎么办荣耀青春版九 华为手机锁屏手势密码忘了怎么办 荣耀手机锁屏密码忘了怎么办 华为p20隐私空间密码忘了怎么办 安全管家隐私保护的密码忘了怎么办 华为手机自带截图键删除了怎么办 飞科电吹风吹一会就断电怎么办 住酒店时电吹风吹坏了怎么办 把话费充到停机的号码上去了怎么办 电信手机卡充值了还停机怎么办 电信手机一直没用却欠费了怎么办 苹果se开起4g信号不好怎么办