题目描述
示例
思路
当遇到需要找出两个位置之间最优解的问题时,我们容易联想到使用双指针算法求解问题。双指针算法一般能够在不需要消耗额外空间的情况下,以较高的效率解决问题。
解题方法
1.首先初始化指向数组头尾的指针
2.使用while循环比较头尾指针的位置大小,若头指针位置小于尾指针时进入循环
3.在循环体中计算当前面积并更新最大面积,当头指针所指元素大于尾指针所指元素时尾指针--,否则头指针--
循环结束后返回max最大值
java代码
力扣官方题解+个人注解:
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int max = 0;
//定义指向数组头尾的指针
int l = 0, r = len - 1;
//当头指针小于尾指针时进入循环
while(l < r) {
//计算当前面积
//注意:Math.min(height[l], height[r]) 是为了得出较短的容器高
int area = Math.min(height[l], height[r]) * (r - l);
//比较更新最大面积
max = Math.max(area,max);
//比较头尾指针指向的大小
if(height[l] > height[r]){
r--;
}else {
l++;
}
}
return max;
}
}
复杂度分析:
时间复杂度
只需要遍历一次数组即可获得最大值,因此时间复杂度为O(n)
空间复杂度
只需要常数个额外的内存空间,因此空间复杂度为 O(1)