当青训营遇上码上掘金

104 阅读3分钟

当青训营遇上码上掘金

接青豆问题是一道经典的算法题,大体思路是使用双指针法和贪心策略。所以对于这种问题,我们不要想整体,而应该去想局部。

算法流程如下:

  1. 对于每个位置,找到左边的最高的那一列(即第一个比当前高度高的那一列)和右边的最高的那一列(即最后一个比当前高度高的那一列)。
  2. 比较左边和右边的那一列的高度,取最小值,并减去当前高度,就是当前位置能接到的青豆的高度。
  3. 重复以上过程,计算每一个位置能接到的青豆的高度,最后加和所有的高度,就是最终的答案。

代码实现:

cssCopy code
int trap(int[] height) {
    int n = height.length;
    int left = 0, right = n - 1;
    int leftMax = 0, rightMax = 0;
    int ans = 0;
    while (left < right) {
        if (height[left] < height[right]) {
            if (height[left] >= leftMax) {
                leftMax = height[left];
            } else {
                ans += leftMax - height[left];
            }
            left++;
        } else {
            if (height[right] >= rightMax) {
                rightMax = height[right];
            } else {
                ans += rightMax - height[right];
            }
            right--;
        }
    }
    return ans;
}

本题的时间复杂度是 O(n)O(n),空间复杂度是 O(1)O(1)

同时整理一下,针对于不同的算法问题,通常有不同的解决思路,但是一些通用的解决思路如下:

  1. 暴力枚举:暴力枚举是一种最简单的解决思路,它试图遍历所有的可能的情况,最终得到正确的答案。当问题的规模较小时,暴力枚举是可以使用的,但当问题规模很大时,暴力枚举通常需要非常大的时间复杂度。
  2. 分治:分治是一种递归的思想,将问题分成若干个子问题,分别解决每个子问题,最后合并得到答案。分治算法通常用于解决排序、查找、图论、计算几何等问题。
  3. 贪心:贪心是一种解决问题的思想,它试图在每一步选择当前可选的最优策略,最终得到问题的最优解。贪心算法通常用于解决选择问题、资源分配问题、路径问题等。
  4. 动态规划:动态规划是一种数学方法,用于解决多阶段决策问题,它通过把原问题分解成若干个子问题,再依次解决每一个子问题,最终得到原问题的最优解。动态规划算法常用于解决问题,如最短路径问题、背包问题、序列问题等。
  5. 回溯法:回溯法是一种递归的算法,用于在一个决策树上寻找所有的合法解。它的基本思路是:首先枚举一种可能的解决方案,如果该方案不合法,则退回到上一步重新选择;如果该方案合法,则继续寻找下一步的方案。回溯法常用于解决组合问题、生成问题等。

这些是一些通用的解决问题的算法解决思路,但是,每一个问题都可能有独特的解决思路,需要结合具体的问题进行分析。