时间复杂度O(n):查找盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
image

此题仅遍历一遍数组,关键是用双指针从数组两端开始查找

我的思路:

  1. 容器宽为width=right-left,高为heightMin
  2. right和left初始为数组第一个索引和最后一个索引,高为两个元素中的最小值
  3. 使用while循环让左右指针移动,直到两指针相遇遍历完数组。同时计算每一次的面积,与上一次的面积比较。

我的代码:

//定义左右指针,初始值分别是数组最左和最右的索引
         int left = 0;
         int right = height.length-1;
         int maxArea = 0;  //存储最大面积

         //让左右指针遍历完数组,循环条件是左右指针未相遇
         while(left < right){
            //计算当前的高,宽和面积
            int heightMin = Math.min(height[left],height[right]);
            int width = right - left;
            int area = width * heightMin;
            //更新最大面积
            maxArea = Math.max(area,maxArea);
            //移动指针
            if(height[left]<height[right]){
                left++;
            }else{
                right--;
            }
        }
         return maxArea;
posted @ 2025-07-21 14:09  junjunyi  阅读(10)  评论(0)    收藏  举报