From 4289e3f2a852225984c7ed577f30dbd47b6a6f0c Mon Sep 17 00:00:00 2001 From: Leo Ma Date: Sun, 30 Jul 2017 08:49:07 +0800 Subject: [PATCH] Trap water Signed-off-by: Leo Ma --- 042_trapping_rain_water/Makefile | 2 + 042_trapping_rain_water/trap_water.c | 57 ++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 042_trapping_rain_water/Makefile create mode 100644 042_trapping_rain_water/trap_water.c diff --git a/042_trapping_rain_water/Makefile b/042_trapping_rain_water/Makefile new file mode 100644 index 0000000..8d38674 --- /dev/null +++ b/042_trapping_rain_water/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test trap_water.c diff --git a/042_trapping_rain_water/trap_water.c b/042_trapping_rain_water/trap_water.c new file mode 100644 index 0000000..a7d5b30 --- /dev/null +++ b/042_trapping_rain_water/trap_water.c @@ -0,0 +1,57 @@ +#include +#include + +static int trap(int* height, int heightSize) { + if (heightSize < 2) { + return 0; + } + + int i, j, top0 = -1, top1 = -1, sum = 0, level = 0; + for (i = 0; i < heightSize; i++) { + if (height[i] > 0) { + top0 = i; + break; + } + } + + while (i < heightSize) { + top1 = -1; + for (j = i + 1; j < heightSize; j++) { + if (height[j] >= height[j - 1]) { + if (top1 < 0 || height[j] >= height[top1]) { + top1 = j; + } + if (height[j] >= height[top0]) { + break; + } + } + } + + if (top1 >= 0) { + int level = height[top0] < height[top1] ? height[top0] : height[top1]; + while (i < top1) { + if (level > height[i]) { + sum += level - height[i]; + } + i++; + } + top0 = top1; + i = top1; + } else { + i = j; + } + } + + return sum; +} + +int main(int argc, char **argv) +{ + int i, count = argc - 1; + int *nums = malloc(count * sizeof(int)); + for (i = 0; i < count; i++) { + nums[i] = atoi(argv[i + 1]); + } + printf("%d\n", trap(nums, count)); + return 0; +}