java中没有指针,故此处的"双指针"是指利用数组下标索引充当指针,对数组元素进行处理,以解决某一类题目。并且双指针并不是只有两个指针,一般解题是用两个指针。
我们以力扣11题为例来感受双指针算法。
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
一、分析题目
我们知道求体积容量最大时,但x距离不变时,两个高度中的最小值决定了体积容量的最大值,类似与短板效应。
二、解题代码
//定义一个数组
public static void main(String[] args) {
int height [] ={1,8,6,2,5,4,8,3,7};
//定义头指针,尾指针
int head = 0 ;
int tail = height.length-1;
//定义一个体积
int val=0;
if(height[head] == height [tail]){
val = height[head]*(tail-head);
}
while (height[head] != height[tail]){
//如果头指针的长度大于尾指针,那么尾指针向前进
if(height[head] > height[tail]){
tail--;
val = Math.max(val,Math.min(height[head],height[tail])*(tail-head));
}//如果头指针的长度小于于尾指针,那么头指针向后进
else {
head++;
val = Math.max(val,Math.min(height[head],height[tail])*(tail-head));
}
}
System.out.println(val);
}