题目:
暴力解法:
class Solution {
public int maxArea(int[] height) {
int i,j;
int area;
int result = 0;
for(i = 0; i < height.length; i++) {
for(j = i+1; j < height.length; j++) {
area = (j - i) * Math.min(height[i],height[j]);
result = Math.max(result,area);
}
}
return result;
}
}
双指针解法:
class Solution {
public int maxArea(int[] height) {
int result = 0;
int i = 0;
int j = height.length - 1;
while(i < j){
int area = (j - i) * Math.min(height[i],height[j]);
result = Math.max(result,area);
if(height[i] < height[j]) {
i++;
}else {
j--;
}
}
return result;
}
}
我在看了nettee的图解双指针后,终于理解了双指针原理,并进行了一些自己的思考
nettee的图解双指针原理
由于 i、j 的约束条件的限制,搜索空间是白色的倒三角部分。由上图可知暴力解法的搜索空间 的大小 O(
n
2
n^2
n2)数量级的, 时间复杂度是O(
n
2
n^2
n2),想要得到O(n)的解法,需要能够一次排除多个单元格。
两根柱子,较短柱子决定容器高度h
∴较长柱子的变换只能使最终容器高度
h
1
h_1
h1≤ h
想法:
若移动长板,容器最终面积一定变小;
若移动短板,容器最终面积可能增大;
∵容器面积 s = h * x
∴在h不变的情况下,x↑ ➡ s↑
用示例代入理解:
0号柱子和7号柱子相比,0号柱子较短,且7号柱子离0号柱子最远 (
x
m
a
x
x_{max}
xmax),此时此行
S
m
a
x
S_{max}
Smax;
排除0号柱子和中间1、2、… 、6柱子的配对,相当于排除i=0行,即i++,记录(0,7)这组柱子结果。
1号柱子和7号柱子相比,7号柱子较短,且7号柱子离1号柱子最远 (
x
m
a
x
x_{max}
xmax),此时此行
S
m
a
x
S_{max}
Smax;
排除7号柱子和中间2、3、… 、6柱子的配对,相当于排除j=7行,即j–,记录(1,7)这组柱子结果。