当青训营遇上码上掘金
正如标题与我所做的事情所言,我正在攒青豆。
这是题目:
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)。。。。。
这是图片实例:
得益于我常年坚持刷leetcode,看见攒青豆问题,那么本能想起接雨水问题。有许多方法可以接雨水,那我也有许多方法可以攒青豆。四种方法分别是:动态规划、单调栈、双指针、线性扫描。我自己使用单调栈和动规AC的,原因是我刚好刷过这类题型,而且是我认为最巧妙的方法。
解出这道题并不难,网上也有许多方法详细解释了其中的巧妙之处。因此我也不再多提。
这是我的解题:
int trap(vector<int>& height) {
int n=height.size();
stack<int> st;
vector<int> m(n);
for(int i=n-1;i>=0;--i){
while(!st.empty()&&height[i]>height[st.top()]) st.pop();
m[i]=st.empty()?-1:st.top();
st.emplace(i);
}
int last=0,ans=0;
for(int i=0;i<n;++i){
if(i==m[last]) last=i;
if(m[last]==-1) break;
ans+=(height[last]-height[i]);
}
stack<int> st2;
for(int i=0;i<n;++i){
while(!st2.empty()&&height[i]>=height[st2.top()]) st2.pop();
m[i]=st2.empty()?-1:st2.top();
st2.emplace(i);
}
last=n-1;
for(int i=n-1;i>=0;--i){
if(i==m[last]) last=i;
if(m[last]==-1) break;
ans+=(height[last]-height[i]);
}
return ans;
}
最近chatGPT很火,我也在许多时候都用了chatGPT。因此我也想让ChatGPT去解这道题。
这是chatGPT的解题思路:
-
首先,创建一个数组,用来存储输入的高度数据。
-
然后,从左到右遍历数组,找到最高的高度,并记录下来。
-
接着,从右到左遍历数组,找到最高的高度,并记录下来。
-
接下来,比较左右两边的最高高度,取其中较小的高度作为接雨水的高度。
-
最后,从左到右遍历数组,计算每个位置的接雨水量,即当前位置的高度减去接雨水的高度,即为接雨水量。
这是chatGPT的代码:
// 解决方案:
// 给定一个数组,其中每个元素表示一个高度:
int[] heights = {0,1,0,2,1,0,1,3,2,1,2,1};
// 计算可以接住的最大雨水量
int maxWater = 0;
// 从左到右遍历数组
for (int i = 0; i < heights.length; i++) {
int leftMax = 0;
// 找到左边最高的高度
for (int j = 0; j < i; j++) {
leftMax = Math.max(leftMax, heights[j]);
}
int rightMax = 0;
// 找到右边最高的高度
for (int j = i + 1; j < heights.length; j++) {
rightMax = Math.max(rightMax, heights[j]);
}
// 计算当前位置可以接住的最大雨水量
int currentMax = Math.min(leftMax, rightMax) - heights[i];
// 更新最大雨水量
maxWater = Math.max(maxWater, currentMax);
}
// 输出最大雨水量
System.out.println(maxWater);