青训营 X 码上掘金」主题 4——攒青豆

61 阅读2分钟

当青训营遇上码上掘金

正如标题与我所做的事情所言,我正在攒青豆。

这是题目:

现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)。。。。。

这是图片实例:

屏幕截图 2023-02-15 001326.png

得益于我常年坚持刷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的解题思路:

  1. 首先,创建一个数组,用来存储输入的高度数据。

  2. 然后,从左到右遍历数组,找到最高的高度,并记录下来。

  3. 接着,从右到左遍历数组,找到最高的高度,并记录下来。

  4. 接下来,比较左右两边的最高高度,取其中较小的高度作为接雨水的高度。

  5. 最后,从左到右遍历数组,计算每个位置的接雨水量,即当前位置的高度减去接雨水的高度,即为接雨水量。

这是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);