【力扣上岸】巧用双指针 11. 盛最多水的容器

253 阅读2分钟

前言

想必很多人都听说过“双指针”这种解法。那么什么时候要使用双指针呢?双指针可以用来解决哪些问题?本文以一道高频题力扣第11题来讲解双指针算法。

题目

leetcode-cn.com/problems/co…

分析

可以盛的水由三个因素决定:左侧第i个端点的高度、右侧第j个端点的高度、i到j的距离。在一段连续的区间上,要确定两个端点的位置,可以让我们联想到一种很常见的思路:双指针。双指针题目的重点在于找对移动指针的条件。

我们可以用一个循环不变量res来存储想要的最大容积,并将它初始化为0。循环的每一轮都判断是否需要更新res。

i初始化为0,j初始化为数组长度-1。那么什么时候两个指针要向内走呢?是哪个指针前进?回到我们的目标上:我们要找到最大的容积。如果指针向前走不可能得到更大的容积,那么这个指针就不要移动。

  • 如果height[i] < height[j],向左移动j,min(height[i], height[j-1]) <= min(height[i], height[j])
  • 如果height[i] < height[j], 向右移动i,min(height[i+1], height[j]) 可能大于,也可能小于,也可能等于min(height[i], height[j])。

这个时候我们可以直接排除第一种情况,如果height[i] < height[j],就不要向左移动j,因为不可能得到更大的res。

题解

class Solution:
    def maxArea(self, height: List[int]) -> int:
        i, j = 0, len(height) - 1
        res = 0
        while i < j:
            if height[i] < height[j]:
                res = max(res, (j - i) * height[i])
                i += 1
            else:
                res = max(res, (j - i) * height[j])
                j -= 1
        return res

复杂度分析

因为只有一层循环,遍历一遍height数组,所以时间复杂度只要O(n)。空间复杂度为O(1)。

后记

如果觉得本文对你有帮助,欢迎关注公粽号【力扣上岸】获取更多干货!点赞是对上岸君最大的支持!