清华主页 - 清华新闻 - 综合时讯 - 正文

算法探索:容器问题最多的水

目录。

一、引入问题 。

二、示例分析 。

三、暴力解决和困境 。

四、双指针法:优雅的解决方案 。

五、总结 。


一、引入问题。


在算法的奇妙世界里,我们经常会遇到各种有趣而富有挑战性的问题,“盛最多水的容器”。就是其中之一。想象一下,线段࿰有一系列垂直排列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;最多一次数组,计算量大大降低。
 。

五、总结。
 。


看似简单的“盛水最多的容器”问题,但它蕴含着丰富的算法思想。从直观的暴力枚举思路到巧妙的双指针优化,我们不仅要学会解决这个特定的问题,更重要的是,掌握了不同算法和应用场景的特点。在未来面对其他算法问题时,󿼌也可以借鉴这种从简单到优化的思维方式,不断探索更高效的解决方案,在算法的海洋中畅游,发现更多的乐趣和奥秘。

2025-06-24 11:45:22

相关新闻

清华大学新闻中心版权所有,清华大学新闻网编辑部维护,电子信箱: news@tsinghua.edu.cn
Copyright 2001-2020 news.tsinghua.edu.cn. All rights reserved.