★11. 盛最多水的容器(2种方法)

本博客探讨了LeetCode第11题——盛最多水的容器的解决方案,重点介绍了双指针算法和优化后的双重for循环算法。双指针法利用短板效应,移动较短的木板以增加水量,实现时间复杂度为O(n)。优化的双重for循环通过确保左指针始终向长度更大的木板移动来减少计算量。
摘要由CSDN通过智能技术生成

11. 盛最多水的容器

本题颇有短板效应的感觉。
自己想的算法也AC了,这里都记录下来。
一个是双指针算法,一个是优化有的双循环算法,都可以AC。

双指针算法。

短板效应
短板效应,即桶之间的水取决于较短的那个板子。
考虑左右指针l 和 r,l向右移, r 向左移,所以l 和 r边界是逐渐缩小的,唯一能做的就是让height[l]和height[r],即这个板子长一点。
考虑如下情景:
如果此时的板子一边长,一边短,是该移动长的还是短的还是随机?
答案是移动短的

因为就算是移动长的,能装的水也一定不会变多

为什么一定不会变多?
因为不管移动长的还是短的,左右边界是逐渐往里收缩越靠越近的。所以边界会变小。那往里的时候遇到一个非常大的数呢?

eg: 1 2 2000 3

对于上面的例子而言,如果移动3到2000的位置,能乘多少水呢?
1和2000的板子,那也是短板效应,也是看1,所以边界小了,两端的值也没有变大。血亏

所以上面的答案就出来了,移动短的,这时才有可能让能乘的水可能变多。

所以大体的思路是

设置双指针l 和 r,然后在当前位置计算一下能存的水,然后比较一下height[l]和height[r]哪个大。将小的那个向中间移动就可以。

ACCode

class Solution {
   
    public int maxArea(int[] height) {
   
        int n = height.length, l = 0, r = n - 1;
        int res = 0;
        while
题目中的"最多水容器"实际上是一个著名的问题,也被称为"水最多的容器"问题。该问题可以用贪心算法来解决。 首先,我们定义一个指针对数组进行遍历。初始时,左指针指向数组的第一个元素,右指针指向数组的最后一个元素。我们计算当前指针所指向的两个元素构成的容器的面积。容器的面积是由两个因素决定的,即两个指针之间的距离和指针所指向的较小的元素的高度。我们将这个面积记录下来,并与之前的最大面积进行比较,保留最大的面积值。 接下来,我们要决定移动哪个指针。我们移动指针的原则是,每次移动指向较小元素的指针,这样才有可能找到更高的柱子,进而获得更大的面积。假设当前左指针指向的元素较小,那么我们将左指针向右移动一位。否则,如果右指针指向的元素较小,我们将右指针向左移动一位。 重复上述的过程,直到两个指针相遇为止。最后得到的最大面积即为所求。 下面是用Python编写的解法代码: def maxArea(height): left = 0 right = len(height) - 1 maxArea = 0 while left < right: area = min(height[left], height[right]) * (right - left) maxArea = max(maxArea, area) if height[left] < height[right]: left += 1 else: right -= 1 return maxArea 这段代码的时间复杂度是O(n),其中n是数组的长度。因为我们只对整个数组进行了一次遍历。因此,该解法是一个高效解法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值