攒青豆

560 阅读1分钟

当青训营遇上码上掘金

攒青豆这一问题和接雨水极为相似,如果能接住青豆,说明该处产生了低洼,低洼处的存储量取决于该处两侧的最小值,通过该处两侧的最小值减去自身的高度,即可求出该处能存储的青豆数量。

我们采用暴力破解法

通过遍历整个数组在每个元素的位置求出该位置左边的柱子中的最大值

int lmax=0;
for(int j=0;j<=i;j++){
    lmax=max(lmax,height[j]);//i是当前位置
}

然后求该位置出右边柱子中的最大值

int rmax=0;
for(int j=i;j<x;j++){
    rmax=max(rmax,height[j]);//x是数组的长度
}

最后进行累加和

ans+=min(lmax,rmax)-height[i];//i是当前位置

完整代码如下

#include <iostream>
#include<algorithm>
using namespace std;
int solution(int height[],int x);
int main()
{
	int x;
	cout << "输入柱子数" << endl;
	cin >> x;
	int* a = (int*)malloc(sizeof(int)*x);
	cout << "输入柱子高度" << endl;
	for (int i = 0; i < x; i++)
	{
		cin >> a[i];
	}
	int c=solution(a,x);
	cout << c << endl;
}

int solution(int height[], int x) {
	int ans = 0;
	for (int i = 0; i < x; i++)
	{
		int lmax=0, rmax=0;
		for (int j = 0; j <= i; j++)
		{
			lmax = max(lmax, height[j]);
		}
		for (int j = i; j <x; j++)
		{
			rmax = max(rmax, height[j]);
		}
		ans += min(lmax, rmax) - height[i];
	}
	return ans;
}

测试结果如下

image.png

创作灵感:通过观察图像能够初步思考出青豆数量是取决于低洼处两侧的最小值减去该处的高度,进一步就是代码实现,通过malloc函数来创造一个动态数组,增加一个变量x存入柱子的数目,通过a数组存入柱子的高度信息,遍历每一个柱子,找到其左柱子的最高处和右柱子的最高处,求出左柱子和右柱子的最小值,然后用最小值减去该处柱子的高度即可求得该处能够接住青豆的数量。