题目链接:力扣
思路:首先吐槽下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
}
}