大家好,我是小鲨鱼,我来打卡今天的签到题了呀,凑着水课写一写,忍住老师的催眠还在写blog的我,快来一起刷题吧。
题目链接
11. 盛最多水的容器https://leetcode-cn.com/problems/container-with-most-water/
题目描述
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
限制
n == height.length
2 <= n <= 10^5
0 <= height[i] <= 10^4
思路
面积 = 边1 x 边2
边1 = 两数之间的距离
边2 = 两数之中较小的一个
我们要获得最大面积,即要获得最长的长和宽,即要保证数组中的两数,距离尽可能的远 并且数值尽可能大,故可以采用双指针,一个在头一个在尾,两数较小的那个往中间走 , 每走一次记录与当前面积进行比较,遍历完便可获得最大面积。
代码
class Solution {
public int maxArea(int[] height) {
int len = height.length;
if(len == 2){
return height[0] < height[1] ? height[0] : height[1];
}
int l = 0, r = len -1;
int curArea = 0;
while(l < r){
int cur = height[l] <= height[r] ? height[l] : height[r]; //使得cur为较短的边
curArea = Math.max(curArea,cur * (r - l)); //记录每一次的面积并进行比较
if(height[l] < height[r]){
++ l;
}else{
-- r;
}
}
return curArea;
}
}
补充
今日打卡get,要一直坚持下去呀。
恰巧此时,两手空空,才无限拥有 。