目录。
一、引入问题 。
二、示例分析 。
三、暴力解决和困境 。
四、双指针法:优雅的解决方案 。
五、总结 。
一、引入问题。

在算法的奇妙世界里,我们经常会遇到各种有趣而富有挑战性的问题,“盛最多水的容器”。就是其中之一。想象一下,线段有一系列垂直排列c;它们与 x 轴共同构成容器,我们的任务是找出能容纳最多水的容器。具体来说,,给定一个长度 n 的整数数组 height ,第 i 线的两个端点是 (i, 0) 和 (i, height[i]) ,我们需要找出其中两条线,使它们与 x 轴组成的容器能容纳最多的水,而且容器不能倾斜。
。
二、示例分析。
。
先来看两个具体的例子,这样可以让我们对问题有更直观的感受。
。
示例1。
。
输入数组为 [1,8,6,2,5,4,8,3 ,在这种情况下容器能容纳水的最大值是 49 。可以从相应的示意图中看到c;由不同垂直线组成的容器,其容量不同,我们要找的是最大的容量之一。
示例2。
输入数组为 [1,1] ,此时输出的最大容量是 1 。通过这两个简单的例子,我相信你对这个问题有了初步的了解。
。
三、暴力解决和困境。

int cmp(const void*e1,const void*e2){ return *(int*)e1-*(int*)e2;}int maxarea(int* height, int heightSize){ int sum=heightSize-1+(heightSize-1)*(heightSize-2)/2; int*arr=(int*)malloc(sizeof(int)*sum); int input=0; for(int i=0;ii;j--) { int temp=height[i]
当我第一次接触这个问题时,,暴力枚举的方法很容易想到。通过两层循环所有可能的两个线段组合,计算它们组成的容器的容量,然后找出最大值。图中右侧的代码是实现暴力枚举的一种方式。它首先计算所有可能组合的数量 sum ,然后使用两层循环遍历数组计算每对线段组成的容器容量并存储在数组中 arr 中,最后对数组进行排序,并返回最大值。
。
但是,这种方法有一个大问题,也就是说,时间复杂度高,为 O(n^2) 。当数组规模较大时,,程序运行的时间会变得非常长,甚至可能出现超时,这显然不是我们想要的结果。
。
四、双指针法:优雅的解决方案。
。
为了减少时间复杂度༌我们可以采用。双指针法。。这种方法就像一场有趣的比赛。指针舞”。,让两个指针从数组的两端向中间移动,逐渐找到最大容量的容器。
。
具体代码如下:
。
c #include int maxArea(int* height, int heightSize) { int left = 0; int right = heightSize - 1; int max_area = 0; while (left < right) { int area = (right - left) * ((height[left] < height[right]) ? height[left] : height[right]); if (area > max_area) { max_area = area; } if (height[left] < height[right]) { left++; } else { right--; } } return max_area;} 。
。
代码开始时,定义两个指针 left 和 right 分别指向数组的开始和结束位置,与此同时,初始化的最大容量 max_area 为 0 。在循环中,计算当前指针所指线段组成的容器容量 area ,如果该容量大于当前记录的最大容量 max_area ,就更新 max_area 。然后,根据两条线段的高度,将短线段对应的指针移动到中间,直到两个指针相遇,此时返回记录的最大容量 max_area 。
。
双指针法的时间复杂度是 O(n) ,与暴力枚举相比,#xff0c;显著提高了效率。因为两个指针从两端移动到中间c;最多一次数组,计算量大大降低。
。
五、总结。
。
看似简单的“盛水最多的容器”问题,但它蕴含着丰富的算法思想。从直观的暴力枚举思路到巧妙的双指针优化,我们不仅要学会解决这个特定的问题,更重要的是,掌握了不同算法和应用场景的特点。在未来面对其他算法问题时,也可以借鉴这种从简单到优化的思维方式,不断探索更高效的解决方案,在算法的海洋中畅游,发现更多的乐趣和奥秘。