分析
-
本题的考点:对撞指针。
-
用两个指针
i, j
分别指向首尾,如果 $h[i]>h[j]$,则j−−
;否则i++
,直到i=j
为止,每次迭代更新最大值。
代码
- C++
class Solution {
public:
int maxArea(vector<int>& h) {
int res = 0;
int i = 0, j = h.size() - 1;
while (i < j) {
res = max(res, min(h[i], h[j]) * (j - i));
if (h[i] > h[j]) j--;
else i++;
}
return res;
}
};
- Java
class Solution {
public int maxArea(int[] h) {
int res = 0;
for (int i = 0, j = h.length - 1; i < j; ) {
res = Math.max(res, Math.min(h[i], h[j]) * (j - i));
if (h[i] > h[j]) j--;
else i++;
}
return res;
}
}
时空复杂度分析
-
时间复杂度:$O(n)$,
n
为数组长度。 -
空间复杂度:$O(n)$,
n
为数组长度。