【刷题】盛最多水的容器

249 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

春招打卡第11天第14篇。

勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏。

掘金的活动真多哇,这个月决定每天用go刷题,一方面提升一下算法水平,另一方面沉淀一下go语言的学习。

Let's GO!

题目描述

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

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

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

说明:你不能倾斜容器。

示例 

示例 1:

image.png

输入:[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

解题思路

  1. 看到这题脑子里的第一反应是,如果最左和左右边都是最高的,那么盛水量最大。退一步思考,越是靠近两端的线高,盛水越多。
  2. 咱们就可以顺着这个思路来实现,即假设两边最高能盛水最多,再依次像内递进,如果里面的线更高,则说明外面的线不是最高的。
  3. 但是期间我遇到了通过率的问题,于是刷了力扣的题解,发现双指针是很好的思路,我之所以有通过率的问题是因为没有考虑到:相同高度时两边的距离越远越好
  4. 还有性能方面的优化:面积的计算受制于较短边,所以我们在利用双指针计算面试时,可以减少不必要的运算,即:向内移动较短边。

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
}

运行结果

image.png

总结

今天学会了双指针的思路,这个月刷了这么多题,今天第一次体会到刷题的快乐,我是不是要悟道了,哈哈哈。

使用双指针思路解答这道题的时间复杂度是O(n),空间复杂度是O(1)。

来源说明

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/co…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

最后

感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!

8e95dac1fd0b2b1ff51c08757667c47a.gif