前言:
之前学习的时候有学过双指针算法,但是平时用的不多,这次拿一道力扣的中等题来练练手,巩固一下自己学过的知识。
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一.题目描述:
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
示例1:
示例2:
示例3:
二.思路分析:
1.题目分析:给出一组非负整数数组,每个元素按下标顺序排入坐标轴中画垂直线,每个元素坐标轴中的垂直线高度为它的元素值,我们需要找出两线之间所能构成的最大的矩形容器
2.要点剖析:题目最终是让我们求得两线之间构成的能装纳最多水的容器,可以理解成求两线之间的矩形面积,这个矩形的高要取两边中较小的一边,这是宽,矩形的长度则是取两边之间的距离,这是长。现在以长宽为要点驱动,使两边的距离尽量长,两边的高度差值尽量大
3.解题思想:既然矩形面积需要同时考虑坐标轴左右两边的长度,这道题目可以使用双指针的算法思想进行解决,首先,设置一个左指针left
让它指向数组最左端,一个右指针right
让它指向数组最右端,总体思路是让左右指针逐渐向中间靠拢,给左右指针设置递进规则:当一边垂直线的高度值大于另一边垂直线时,高度值低的那一侧的指针向中间推进(两边一样打时,默认左指针推进),这样是为了留住较大的一条边垂直线,尽可能构成更大的面积值。左右指针推进前设置一个记录值res
,移动过程中记录最大的面积值,如果出现更大的面积则进行替换,在双指针跑完一遍停止后就能取得最大的面积了
4.复杂度:时间复杂度 O(N):双指针遍历一次底边宽度 N 。空间复杂度 O(1):指针使用常数额外空间。
三.代码
var maxArea = (width) => {
let i = 0;
let j = width.length - 1; //
let res = 0; // 设置记录值来记录最大面积
while(i < j) { // j不再大于i时,终止循环
res = width[i] < width[j] ? // 用三元运算符来进行条件判断,推进指针
Math.max(res,(j - i) * width[i++]):
Math.max(res,(j - i) * width[j--]);
}
return res;
}
四.总结
这是一道很经典的面试题,它的最有解之一就是使用双指针算法进行解决,通过左右指针的遍历来求得最大值。通过这道题,我对于双指针算法的理解更加的深入了,这也算是对自己前段时间算法学习的一次知识巩固,让自己有所收获,希望这篇文章也能够对你有所帮助,让你能够理解一些双指针算法,最后,如果觉得这篇文章还不错的话,希望可以帮忙点个赞哦,万分感谢。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!