11. 盛最多水的容器

本文探讨了一道力扣平台上的经典双指针问题,涉及如何使用Kotlin来找出两个高度数组中能容纳的最大水量。作者指出Kotlin的for循环在某些场景下可能不易使用,并希望未来能有一种语言统一集合的遍历方式。解决方案中,定义了两个指针i和j,根据左右两边的较矮高度计算当前宽度的最大水量,并不断移动较矮一侧的指针以寻找最大值。时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

题目链接:力扣

思路:首先吐槽下kotlin的for循环(我感觉kotlin的for循环真的好难用),还有就是啥时候有一种语言,各种集合的遍历方式是统一的就好了(目前在我的认知里面还没有)。

这道题目是典型的双指针问题。定义两个指针 i,j ,然后开始遍历height数组即可。怎么遍历呢?首先我们需要思考下,在宽度一定的情况下,高是怎么确定的呢?很简单,因为是装水,所以高是通过矮的那边确定的。这样我们就可以做了。找到宽(j-i),找到高(左右指针指向的较矮的那边的高度),两者相乘即可。然后较矮的那边的指针就可以移动了,因为在高一定的情况下,枚举到的状态已经是宽最大的情况了。所以只需要较矮的那边移动即可。每次求出一个值,都取下最大值,这样遍历一遍得到的值就是我们想要的答案。

简单分析下时间复杂度:可以看出我们只需要遍历一遍height数组就可以了,所以说时间复杂度为 O(n)

最后提一下,这个题也算是双指针的经典题目了(个人见解),大家可以好好悟一下。有不懂的可以在评论区回复哦~~~

上代码:

import kotlin.math.max

class Solution {
    fun maxArea(height: IntArray): Int {
        var i = 0
        var j = height.size - 1
        var result = 0
        while (i < j) {
            if (height[i] < height[j]) {
                result = max(result, height[i] * (j - i))
                i++
            } else {
                result = max(result, height[j] * (j - i))
                j--
            }
        }
        return result
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值