当青训营遇上码上掘金
接青豆问题是一道经典的算法题,大体思路是使用双指针法和贪心策略。所以对于这种问题,我们不要想整体,而应该去想局部。
算法流程如下:
- 对于每个位置,找到左边的最高的那一列(即第一个比当前高度高的那一列)和右边的最高的那一列(即最后一个比当前高度高的那一列)。
- 比较左边和右边的那一列的高度,取最小值,并减去当前高度,就是当前位置能接到的青豆的高度。
- 重复以上过程,计算每一个位置能接到的青豆的高度,最后加和所有的高度,就是最终的答案。
代码实现:
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;
}
本题的时间复杂度是 ,空间复杂度是 。
同时整理一下,针对于不同的算法问题,通常有不同的解决思路,但是一些通用的解决思路如下:
- 暴力枚举:暴力枚举是一种最简单的解决思路,它试图遍历所有的可能的情况,最终得到正确的答案。当问题的规模较小时,暴力枚举是可以使用的,但当问题规模很大时,暴力枚举通常需要非常大的时间复杂度。
- 分治:分治是一种递归的思想,将问题分成若干个子问题,分别解决每个子问题,最后合并得到答案。分治算法通常用于解决排序、查找、图论、计算几何等问题。
- 贪心:贪心是一种解决问题的思想,它试图在每一步选择当前可选的最优策略,最终得到问题的最优解。贪心算法通常用于解决选择问题、资源分配问题、路径问题等。
- 动态规划:动态规划是一种数学方法,用于解决多阶段决策问题,它通过把原问题分解成若干个子问题,再依次解决每一个子问题,最终得到原问题的最优解。动态规划算法常用于解决问题,如最短路径问题、背包问题、序列问题等。
- 回溯法:回溯法是一种递归的算法,用于在一个决策树上寻找所有的合法解。它的基本思路是:首先枚举一种可能的解决方案,如果该方案不合法,则退回到上一步重新选择;如果该方案合法,则继续寻找下一步的方案。回溯法常用于解决组合问题、生成问题等。
这些是一些通用的解决问题的算法解决思路,但是,每一个问题都可能有独特的解决思路,需要结合具体的问题进行分析。