LeetCode Hot 100 - 盛最多水的容器

题目描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例

示例1

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

输出:49

解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例2

输入:[1,1]

输出:1

解题思路

显然,需要使用到双指针的思路来解决该题。指针收缩的条件为:高度较低的一方进行收缩

我们可以定义左指针left,从数组的最左端开始,右指针right,从数组的最右端开始,再定义一个最大的容量maxCap。开启一个循环,循环的条件为 left < right,判断当前left和right所能容纳的容量是否大于maxCap,如果是的话,则进行赋值替换,然后高度较低的一方进行收缩,进入下一轮循环,直到退出循环

代码

func maxArea(height []int) int {
    // 声明相关变量指针及最大容量
    length := len(height)
    left := 0
    right := length-1
    maxCap := 0

    
    for left < right {
        // 如果左指针指向的高度小于右指针,则当前的容量高度则是以左指针为准,反之则是右指针
        if height[left] < height[right] {
            // 进行最大容量赋值替换
            if (right-left)*height[left] > maxCap {
                maxCap = max(maxCap, (right-left)*height[left])   
            }
            // 左指针指向的高度更小,左指针收缩
            left++
        } else {
            // 逻辑同上
            if (right-left)*height[right] > maxCap {
                maxCap = (right-left)*height[right]
            }
            right--
        }
    }

    return maxCap
}

复杂度分析

时间复杂度:从代码可知,循环逻辑最坏情况下,会执行N次,故其时间复杂度为 O(N),N为数组的长度;

空间复杂度:仅声明了几个简单的int类型变量,因此其空间复杂度为O(1)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值