程序员

力扣 11 盛最多水的容器

2020-04-28  本文已影响0人  zhaojinhui

题意:给定一个数组,每一个元素代表容器壁的高度,两个元素的间距代表容器的宽度,找出两个数能组成成最多水的容器
比如:[1,5,1,4],当容器壁为5和4时盛水最多,最多的盛水为:Math.max(5, 4) * (3-1)= 6,其中3和1是4和5在数组中的索引

思路:

  1. 在数组的开始和结尾各设置一个指针;
  2. 指向数值较小的一边优先开始移动;
  3. 移动开始前先查看当前盛水是否比目前记录的最大值大,如果大则更新最大值;
  4. 记录开始的指针值;
  5. 移动指针直到找到比开始的值大的新值,因为在移动的过程中,宽度在不断减小,只有当新移动到的容器壁比最开始的容器壁高,才可能会比之前记录的值大;

思想:首尾指针法

复杂度:时间O(n),空间O(1)

class Solution {
    public int maxArea(int[] height) {
        int len = height.length;
        int s = 0;
        int e = len - 1;
        int res = 0;
        while(s<e) {
            if(height[s]<=height[e]) {
                res = Math.max(height[s] * (e-s), res);
                int temp = height[s];
                while(s<e && height[s] <= temp) {
                    s++;
                }
            } else {
                res = Math.max(height[e] * (e-s), res);
                int temp = height[e];
                while(s<e && height[e] <= temp) {
                    e--;
                }
            }
        }
        return res;
    }
}
上一篇下一篇

猜你喜欢

热点阅读