Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
春招打卡第11天第14篇。
勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。
掘金的活动真多哇,这个月决定每天用go刷题,一方面提升一下算法水平,另一方面沉淀一下go语言的学习。
Let's GO!
题目描述
给定一个长度为 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:
输入:height = [1,1]
输出:1
提示:
n == height.length 2 <= n <= 105 0 <= height[i] <= 104
解题思路
- 看到这题脑子里的第一反应是,如果最左和左右边都是最高的,那么盛水量最大。退一步思考,越是靠近两端的线高,盛水越多。
- 咱们就可以顺着这个思路来实现,即假设两边最高能盛水最多,再依次像内递进,如果里面的线更高,则说明外面的线不是最高的。
- 但是期间我遇到了通过率的问题,于是刷了力扣的题解,发现
双指针
是很好的思路,我之所以有通过率的问题是因为没有考虑到:相同高度时两边的距离越远越好
- 还有性能方面的优化:面积的计算受制于较短边,所以我们在利用双指针计算面试时,可以减少不必要的运算,即:向内移动较短边。
AC代码
func maxArea(height []int) int {
i := 0
j := len(height) - 1
var ret int
for i < j {
var area int
if height[i] > height[j]{
area = (j-i)* height[j]
}else {
area = (j-i)* height[i]
}
if area > ret {
ret = area
}
if height[i] < height[j] {
i++
}else {
j--
}
}
return ret
}
运行结果
总结
今天学会了双指针
的思路,这个月刷了这么多题,今天第一次体会到刷题的快乐,我是不是要悟道了,哈哈哈。
使用双指针
思路解答这道题的时间复杂度是O(n),空间复杂度是O(1)。
来源说明
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/co…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
最后
感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!