11. 盛最多水的容器:利用双指针的遍历数组的思路

76 阅读1分钟

归类:遍历数组

使用双指针的方式遍历数组,寻找特定的值 题目链接:

11.盛最多水的容器

先提供代码:

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) 的复杂度

步骤:

  • 定义指针ij分别指向数组的首和尾
        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指针时,终止循环

附图:

image.png