/*
说明: 此算法不是最优的,最坏的情况O(N^2),网上有更好的算法O(N),这个只是实现的一个思路
接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
提示:
n == height.length
1 <= n <= 2 * 10 ^ 4
0 <= height[i] <= 10 ^ 5
通过次数657,166提交次数1,050,966
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
int trap(int* height, int heightSize)
{
int left_max = height[0], left_index = 0;
int right_max = -1, right_index = 0;
int i = 0, j = 0, total = 0;
int *bucket_sum = (int *)malloc(sizeof(int) * heightSize);
bucket_sum[0] = height[0];
for (i = 1; i < heightSize; i++) {
bucket_sum[i] = height[i] + bucket_sum[i - 1];
}
for (i = 1; i < heightSize; i++) {
if (right_max < height[i]) {
right_max = height[i];
right_index = i;
}
if (right_max >= left_max) {
int volume = left_max * (right_index - left_index - 1);
int delta = bucket_sum[right_index - 1] - bucket_sum[left_index];
total += volume - delta;
left_max = right_max;
left_index = right_index;
right_max = -1;
right_index = 0;
}
//if goes to last one, right < left, then left shift to last right
if ((right_index != 0) && (i == (heightSize - 1))) {
int volume = right_max * (right_index - left_index - 1);
int delta = bucket_sum[right_index - 1] - bucket_sum[left_index];
total += volume - delta;
left_max = right_max;
left_index = right_index;
right_max = -1;
right_index = 0;
i = left_index;
}
}
free(bucket_sum);
return total;
}
接雨水-一个笨办法
最新推荐文章于 2024-07-19 19:11:19 发布