双指针
双指针是涉及到数组算法题最常用的解法,例如力扣题:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
此题最优的做法是使用双指针。如果使用暴力解法遍历两遍数组找最大值也可以解出,但时间复杂度为O(n^2),会超出时间限制
双指针解法:
思路:指针初始化时一个指向数组的第一个元素,一个指向数组的最后一个元素,算出此时的乘积,然后向前或向后移动值较小的指针(要求最大值如果移动较大的值显然不合理),遍历一遍数组得到最大值。
代码实现
public int maxArea(int height){
int length = height.length;
int start = 0;
int end = length - 1;
int maxWater = 0;
while(start < end){
if(height[start] >= height[end]){
int water = (end - start) * height[start];
end--;
} else {
int water = (end - start) * height[end];
start++;
}
if(water > maxWater){
maxWater = water;
}
}
return maxWater;
}
此方法只遍历了一遍数组所以时间复杂度为O(n)。