「双指针」的魅力!图解算法题「盛最多水的容器」!

今天分享的题目来源于 LeetCode 第 11 号问题:盛最多水的容器。这是一道能够使用 双指针 的技巧来解题的经典题目。java

题目描述

给定 n 个非负整数 a1,a2,...,an,每一个数表明坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器能够容纳最多的水。算法

注意:你不能倾斜容器,n 至少是2。编程

img

图中垂直线表明输入数组 [1,8,6,2,5,4,8,3,7]。在此状况下,容器可以容纳水(表示为蓝色部分)的最大值为 49。数组

示例:动画

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

题目解析

定义 ij 两个指针分别指向数组的左右两端,而后两个指针向中间搜索,而且更新面积最大值 res,直到 i == j 时返回 resspa

其中 容器装水量的算法是找出左右两个边缘中较小的那个乘以两边缘的距离指针

动画描述

代码实现

class Solution {
    public int maxArea(int[] height) {
        int i = 0, j = height.length - 1, res = 0;
        while(i < j){
            res = height[i] < height[j] ? 
                Math.max(res, (j - i) * height[i++]): 
                Math.max(res, (j - i) * height[j--]); 
        }
        return res;
    }
}

复杂度分析

  • 时间复杂度 O(N),双指针遍历一次底边宽度 N 。
  • 空间复杂度 O(1),指针使用常数额外空间。

❤️ 看完三件事:

若是你以为这篇内容对你挺有启发,我想邀请你帮我三个忙:code

  • 点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
  • 关注我和专栏,让咱们成为长期关系
  • 关注公众号「五分钟学算法」,第一时间阅读最新的算法文章,公众号后台回复 1024 送你 50 本 算法编程书籍。
相关文章
相关标签/搜索