归类:遍历数组
使用双指针的方式遍历数组,寻找特定的值 题目链接:
先提供代码:
class Solution {
public int maxArea(int[] height) {
int i = 0; // 模拟头部指针
int j = height.length-1; // 模拟尾部指针
int maxArea = 0;
while (i < j){
int min = Math.min(height[i], height[j]);
int span = j - i;
int res = min * span;
maxArea = res > maxArea ? res : maxArea;
if (min == height[i]) {
i ++;
}else{
j--;
}
}
return maxArea;
}
}
思路:
- 体积:短板 × 间隔
- 短板:Math.min(a,b)
- 间隔:
b下标
减a下标
即可
这个题主要是:遍历整个数组,找到两个特定的值。
那么如何减少遍历的时间复杂度度呢?因为尝试过双重for循环 O(N^2),发现会超时,所以使用双指针可以到 o(N) 的复杂度
步骤:
- 定义指针
i
和j
分别指向数组的首和尾
int i = 0; // 模拟头部指针
int j = height.length-1; // 模拟尾部指针
- 计算短板、间隔 -> 面积
int min = Math.min(height[i], height[j]);
int span = j - i;
int res = min * span;
- 记录下最大的面积
maxArea = res > maxArea ? res : maxArea;
- 下一次怎么移动指针?丢弃短板,尝试寻找长板
if (min == height[i]) {
i ++;
}else{
j--;
}
- 迭代的终止条件
当
i
指针 大于j
指针时,终止循环