11. 盛最多水的容器


暴力解法(超时)

import java.util.Arrays;

class Solution {
    public int maxArea(int[] height) {

        /**
         * 暴力解法,直接使用额外数组存放每一个坐标为左边界时的最大面积,最后对数组求最大值
         */
        int[] res = new int[height.length];

        for (int i = 0; i < height.length; i++) {

            int max = 0;

            for (int j = i + 1; j < height.length; j++) {

                int area = Math.min(height[i], height[j]) * (j - i);

                if (area > max){
                    max = area;
                }
            }

            res[i] = max;
        }

        return Arrays.stream(res).max().getAsInt();
    }
}

/**
 * 时间复杂度 O(n^2)
 * 空间复杂度 O(n)
 */

优化1——双指针法

class Solution {
    public int maxArea(int[] height) {

        /**
         * 双指针法遍历
         * 如果往左或者往右的面积都小于当前的面积,则先记录下当前面积,其不一定是最大面积
         * 然后让边界值小的那个边界移动
         */
        int left = 0;
        int right = height.length - 1;
        int area = 0;
        int max = 0;

        while (left < right){

            area = Math.min(height[left], height[right]) * (right - left);

            if (Math.min(height[left + 1], height[right]) * (right - left - 1) > area){
                left++;
            }
            else if (Math.min(height[left], height[right - 1]) * (right - left - 1) > area){
                right--;
            }
            else {

                if (area > max) {
                    max = area;
                }

                if (height[left] <= height[right]){
                    left++;
                }
                else {
                    right--;
                }
            }
        }

        return max;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化2——简化边界移动的判断条件

class Solution {
    public int maxArea(int[] height) {

        /**
         * 双指针法遍历
         * 每次让边界值小的那个边界移动,实时更新当前最大的面积
         */
        int left = 0;
        int right = height.length - 1;
        int area = 0;
        int max = 0;

        while (left < right){

            area = Math.min(height[left], height[right]) * (right - left);
            max = Math.max(area, max);

            if (height[left] < height[right]){
                left++;
            }
            else {
                right--;
            }
        }

        return max;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/container-with-most-water/