LeetCode-42.收集雨水

一、题目描述

计算最大能接雨水量。

 对应Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

 

二、实现C代码

1. 解法1

通过动态规划思想,选求出下标i位置最左侧的最大高度,然后求出下标i位置最右侧最大高度,两个高度求较小值,此较小值与此位置的高度差就是此位置能存的谁量。

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define max_val(x, y) ((x) > (y) ? (x) : (y));

int maxv(int x, int y) {
    return x > y ? x : y;
}

int minv(int x, int y) {
    return x > y ? y : x;
}

#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))

int height_array(int *ht, int sz)
{
    int i, mh, sum = 0, lm = 0, rm = 0;
    int lf[100];
    int ri[100];
    
    for(i = 0; i < sz; i++) {
        lf[i] = lm;
        lm = maxv(lm, ht[i]);
    }

    for (i = sz-1; i >= 0; i--) {
        ri[i] = rm;
        rm = maxv(rm, ht[i]);

        mh = minv(lf[i], ri[i]);
        if (mh > ht[i]) {
            sum += mh - ht[i];
        }
    }

    for(i = 0; i < sz; i++) {
        printf("lf[%d]=%d, ri[%d]=%d\n", i, lf[i], i, ri[i]);
    }

    return sum;
}


void get_cmdline_array(int *arr, int *sz)
{
    char str[512];
    char *p = str;
    int i, c, idx = 0;

    printf("Input int array like [12, 163, 5, 2, 9]\n");
    fgets(str, *sz, stdin);
    printf("str=%s\n", str);

    while (*p) {
        if (isdigit(*p)) {
            c = atoi(p);
            arr[idx++] = c;
            p++;
        }
        while(isdigit(*p)) {
            p++;
        }
        p++;
    }
    *sz = idx;

    for (i = 0; i < idx; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main()
{
    //int arr[100];
    //int sz = 100;
    int arr[] = {0,1,4,2,1,0,1,4,2,1,2,1};
    int sz = ARRAY_SIZE(arr);
    int sum_water;

    //get_cmdline_array(arr, &sz);
    
    sum_water = height_array(arr, sz);

    printf("sum_water=%d\n", sum_water);

    return 0;
}
复制代码

 

参考

https://www.jb51.net/article/217217.htm

 

posted on   Hello-World3  阅读(1)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-02-13 Linux时间子系统

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示