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 2025-02-13 21:48 Hello-World3 阅读(1) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2020-02-13 Linux时间子系统