LeetCode算法 —— 盛最多水的容器(双指针原理详解)

作者:浪子花梦,一个有趣的程序员 ~
这个题目比较简单,因为以前做过相关的题目,写好了之后看了一下官方的答案,发现都差不多,此文来讲解这个双指针原理,没看官方的解释 ~


题目:
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。
在这里插入图片描述
示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49


双指针原理详解

首先,我们看到这种题目一般的思想都是找出所有的可能性,在这个思想的基础上我们在加上双指针原理,那么这个思想就是一个很好的思路了,下面我们来详细的来解释一下 . . .

首先,这个一开始的情况,我们找到开头与结尾的那个下标索引:
在这里插入图片描述

原理解析:

我们每次都拿left 与 right进行比较,如果哪个元素比较小,那么他将进行改变,left 则++,right则–,这是为什么呢?因为比较小的那个元素获得的容量已经是最大了(例如:left = 0, right = 8时 arr[left] = 1,arr[right] = 7,这时的 arr[left] 对应的容量等于 1 * 8 已经是所有的可能中已经求出最大的值了,因为 left 和 right的距离最远),所以我们将改变较小的那个值的索引 . . .

所以,反反复复的执行同一个操作,当 left 与 right相等时,也就是寻找结束的时候,答案也就出来了,代码比较少,如下所示:
在这里插入图片描述

所以,我们最大的值求出的时候如下所示:
在这里插入图片描述

水容量 Max = 7 * 7 = 49


猜你喜欢

转载自blog.csdn.net/weixin_42100963/article/details/107288446
今日推荐