题目
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
思路
首先定义一个宏找最小,方便计算面积
然后写一个函数算面积
然后主函数写一个循环,双指针操作了一手
最后记得返回最大面积,,我第一次提交忘了
注意这个不是滑动窗口,因为尽管这段代码中的双指针技术在操作上看起来像是一个窗口在数组上滑动,但它的目的是为了寻找两条线段之间的最大面积,而不是为了维护满足特定条件的子数组。因此,这段代码更准确地被描述为使用双指针技术,而不是滑动窗口算法。
-
双指针技术:通常用于有序数组或链表,用来找到一对特定的元素。在这个问题中,我们使用双指针来找到可以形成最大面积的两个垂直线。两个指针分别从数组的两端开始,向中间移动,直到它们相遇。在每一步中,我们都会根据当前指向的两个线段来计算容器的面积,并更新最大面积。
-
滑动窗口算法:通常用于解决连续子数组或子字符串的问题,这些子数组或子字符串满足某种特定的条件。滑动窗口算法通过在数组或字符串上移动两个边界来维护一个窗口,这个窗口可以是固定或者动态变化的大小。滑动窗口算法的关键在于,窗口的移动通常是单向的,而且通常只需要线性时间就可以找到问题的解。
代码
#define MIN(x,y) ((x) < (y) ? (x) : (y))
int calculateArea(int x, int y, int width)
{
if(x <= 0 || y <= 0 || width <= 0)
{
return 0;
}
else
{
return width * MIN(x,y);
}
}
int maxArea(int* height, int heightSize)
{
int *head = height;
int *tail = height + heightSize - 1;
int maxArea = 0;
int Area = 0;
while(head != tail)
{
Area = calculateArea(*head, *tail, tail - head);
if (Area > maxArea)
{
maxArea = Area;
}
if(*head <= *tail)
{
head ++;
}
else
{
tail --;
}
}
return maxArea;
}