LeetCode.M11
题目:
题目大意:
如图所示。
数据范围:
如图所示
思路:
采用双指针,所容纳的水为min(h[l], h[r]) * (r - l) ,初始时l = 0,r = len - 1,接下来选择该移动哪边的指针。无论l或r向中间收缩一格,都会导致水槽底边宽度(r - l)变短:
- 若向内移动短板 ,水槽的短板 min(h[i],h[j]) 可能变大,因此下个水槽的面积可能增大 。
- 若向内移动长板 ,水槽的短板 min(h[i],h[j]) 不变或变小,因此下个水槽的面积一定变小 。
因此我们每次只需要向内移动短板的指针即可。
代码:
class Solution {
public int maxArea(int[] height) {
int l = 0, r = height.length - 1, res = 0;
while (l < r){
int hl = height[l], hr = height[r], t = r - l;
if (hl < hr){
res = Math.max(res, t * hl);
l ++ ;
}else {
res = Math.max(res, t * hr);
r -- ;
}
}
return res;
}
}
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = new int[]{1,8,6,2,5,4,8,3,7};
System.out.println(solution.maxArea(nums));
}
}
时空复杂度分析等:
-
时间复杂度 : O(n)
-
空间复杂度 : O(1)