盛最多的水

1.题目

盛最多的水

2. 暴力

遍历所有可能

class Solution {
public:
    int maxArea(vector<int>& A) {
        int res = -1;
        int m = A.size();
        for (int i= 0; i< m; i++) {
            for (int j = i+1; j < m; j++) {
                int tmp = (j - i) * min(A[i], A[j]);
                res = max(res, tmp);
            }
        }
        return res;
    }
};

2. 优化

面积= 间距 * 最小的高度
定义两个指针分别向内移动,由于,每次都是移动一步,相对两个指针而言,无论移动哪个指针,间距始终再减小并且减小的值始终为1;
为了保障面积最大,只有找出高度大的哪个指针向内部移动,这样可以保证面积最大;

class Solution {
public:
    int maxArea(vector<int>& A) {
        int res = -1;
        int m = A.size();
        int i = 0, j = m - 1;
        while (i < j) {
            int tmp = (j - i) * min(A[i], A[j]);
            if (A[i] < A[j]) {
                i++; 
            } else {
                j--;
            }
            res = max(res, tmp);
            
        }
        return res;
    }
};