对撞指针
对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。
示例1: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co…
var maxArea = function(height) {
var brr=0 //最大值
//定义两个变量,i从前向后寻找值,j从后往前寻找值,当i大于j时就说明已经寻找完所有的值
for(let i=0,j=height.length-1;i<j;){
//判断最小的边
let b=height[i]>height[j]?height[j]:height[i]
//求的装水量
let minheight=(j-i)*b
//当前装水量和上一次进行比较,选出最大的
brr=Math.max(brr,minheight)
//当前面值大于后面值时,说明当height[i]固定时,还需移动j来判断是否是最大值,所以j--
//当前面值小于后面值时,说明当height[j]固定时,还需移动i来判断是否是最大值,所以i++
height[i]>height[j]?j--:i++
}
return brr
};
快慢指针
快慢指针也是双指针,但是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。