【LeetCode】11. 盛最多水的容器

1,107 阅读2分钟

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • n == height.length
    • 2 <= n <= 105
    • 0 <= height[i] <= 104

二、思路分析:

我们拿到本题,读取题意要求我们找出盛水最多的容器面积,换言之就是找到矩形面积最大的长高,就能求出最大面积啦。在动手解答题目之前,我们好好明确题目细节点:

  • 题目给出的参数heigh数组,元素都是整数类型的
  • height 每一个线条都是由(i,0)和(i,height[i])组成
  • 容器中盛水,不能发生倾斜,以最小高为边界

我们解答本题,想要保证每一次取到长度和高度都是最佳的,我们可以使用双指针的方法。

  • 容器的面积公式:(len(height)-1-i)*minheight
  • 定义两个指针i,j:i指针height开始位置,j指针指向height末尾🔚
  • minheight是取height[i]与height[j]最小值
  • 当height[i] 小于 height[j]时,i指针往右移动
  • 当height[i] 大于 height[j]时,j指针往左移动
  • 直到 i指针 大于 j指针时,退出循环♻️

题目给出的示列1来推理过程,如下图所示:

image.png

根据上述思路,我们使用python可以轻松实现,代码如下:

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """

        j = len(height)-1
        i = 0
        zoom = 0

        while i<j:
            minheight = min(height[i],height[j])
            zoom = max(zoom,minheight*(j-i))
            if height[i] <= height[j]:
                i +=1
            else:
                j -=1
        
        return zoom

三、总结:

本题仍然考察我们使用双指针思想,开始与末尾指针往中间移动,能保证每一次取到临界值最佳的,因此只用遍历一次height列表就能找到最大的面积,AC代码提交记录如下:

image.png

  • 时间复杂度O(n),n为height列表长度
  • 空间复杂度O(1),没有使用额外空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~