给定一个长度为 n的整数数组height,有n条垂线,第i条线的两个端点是(i,0)和(i,height[i]).
找出其中两条线,使得他们与x轴共同构成的容器可以容纳更多的水。
返回容器不倾斜的前提下可以储存的最大水量。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//暴力法,大概就是冒泡排序的思想
//这题多少沾点 这个方法复杂度太高过不了
int test1(int* height, int heightSize)
{
int sum = 0;
int left = 0;
int right = 1;
for (left = 0; left < heightSize - 1 ;left++)
{
for (right = heightSize - 1; right > left; right--)
{
if ((height[left] * (right - left) > sum) && (height[right] * (right - left) > sum))
{
if (height[left] > height[right])
sum = height[right] * (right - left);
else
sum = height[left] * (right - left);
}
}
}
return sum;
}
//在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 −1-1−1 变短:
//若向内 移动短板 ,水槽的短板 min(h[i], h[j])min(h[i], h[j])min(h[i], h[j]) 可能变大,因此下个水槽的面积 可能增大 。
//若向内 移动长板 ,水槽的短板 min(h[i], h[j])min(h[i], h[j])min(h[i], h[j]) 不变或变小,因此下个水槽的面积 一定变小 。
//
//因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
//算法流程:
//
//初始化: 双指针 iii, jjj 分列水槽左右两端;
//循环收窄: 直至双指针相遇时跳出;
//更新面积最大值 sum ;
//选定两板高度中的短板,向中间收窄一格;
//返回值: 返回面积最大值 sum即可
//这样的时间复杂度是O(n)
int test2(int* height, int heightSize)
{
int sum = 0;
int left = 0;
int right = heightSize-1;
while (left <= right)
{
if (height[left] < height[right])
{
if (sum < height[left] * (right - left))
sum = height[left] * (right - left);
left++;
}
else
{
if (sum < height[right] * (right - left))
sum = height[right] * (right - left);
right--;
}
}
return sum;
}
int main()
{
int height[100] = { 1, 9, 6, 2, 5, 4, 8, 9, 7 };
/*printf("%d", sizeof(height) / sizeof(int));*/
int heightSize = 9;
//int sum = test1(height, heightSize);
int sum = test1(height, heightSize);
printf("%d", sum);
}