![题目详情](https://i-blog.csdnimg.cn/blog_migrate/0905964b8efc3aaa1d5c2b444a830639.png)
题解
思路1:暴力法
- 把每两根垂直线之间求一次面积,取所有面积中的最大值,
- 分析得时间复杂度为O(n^2) ,空间复杂度O(1),代码实现如下
var maxArea = function (num) {
let maxArea = 0
for (let i = 0; i < num.length - 1; i++) {
for (let j = i + 1; j < num.length; j++) {
let temp = (j - i) * Math.min(num[i], num[j])
maxArea = temp > maxArea ? temp : maxArea
}
}
return maxArea
};
思路2:双指针法
- 设两个指针,一个maxArea ,分别为left 和 right,所求的area= Min(height[left],height[right])* (right - left),如果要取遍所有可能,左指针和右指针势必要往中间移,直到两个指针相遇才停止,再往中间移的过程中 right - left 不断变小,如果让左指针和右指针中较大者的往中间移则 min(height[left],height[right])只有可能变得更小,那么area只会变小,则无法取到最大值,所以如果要想取最大值只能让较小者往中间移,这样min(height[left],height[right])才有可能变大,才能取边所有可能,中间不断比较记录最大值,最后返回。
- 因为只遍历了一遍,所以时间复杂度为O(n) 没有开辟新的辅助空间空间复杂度为O(1)
var maxArea = function(height) {
let l = 0,
r = height.length - 1,
maxArea = 0
while (l < r) {
let temp = (r - l) * Math.min(height[l], height[r])
maxArea = temp > maxArea ? temp : maxArea
height[l] > height[r] ? r-- : l++
}
return maxArea
};
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c01520beac031c80a79913161a8e662c.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bdd2037c56da33c863d877e6a0c00ee0.png)