当青训营遇上码上掘金
类似题目:leetcode接雨水42题
解题思路:
在某单位能容下的青豆数量等于该列左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。例如列3左侧最高的柱子是列0,高度为5(以下用lHeight表示)。列3右侧最高的柱子是列4,高度为4(以下用rHeight表示)。列3柱子的高度为1(以下用height表示)那么列3的青豆单位体积为列0和列4的高度最小值减列4高度,即:min(lHeight, rHeight) - height = 3。列4的青豆单位体积求出来了,宽度为1,相乘就是列4的青豆单位体积了。此时求出了列4的青豆单位体积。一样的方法,只要从头遍历一遍所有的列,然后求出每一列青豆的体积,相加之后就是总青豆的体积了。
贴个以前写的双指针写法(ACM格式,没用掘金的格式,运行已通过)
初始化left和right以及ans(最终青豆单位),分别位于输入数组的两端,并将left和right的数值定义为maxleft和maxright(maxleft是0到left的最大值,maxright是right到末尾的最大值),然后向中间移动,边移动边计算。当left大于right停止循环,当maxleft小于maxright时,ans += maxleft - height[left],left左移一位。反之……。
时间复杂度:O(N)。遍历了一遍数组。
空间复杂度:O(1)。
补充:
还有暴力法(面试基本别写,肯定超时),动态规划(多写,面试笔试常考),单调栈(同左)。动态规划的时间复杂度和空间复杂度没啥差别。我自己感觉双指针写着挺舒服,好理解,动态规划难就难在状态转移方程上,这个可以多看看代码随想录,写的挺好有套路。