目录
-
题目:
https://leetcode-cn.com/problems/container-with-most-water/
-
解题思路:
- 【1】使用双重for循环:
先求出每一个矩形的面积,再每次和已知矩形面积最小值比较。
class Solution {
public int maxArea(int[] height) {
int r = height.length;
int area;
int ans = 0;
for(int i = 0;i < r;i++){
for(int j = 0;j < r;j++){
int m = Math.max(i,j);
int n = Math.min(i,j);
area = (Math.min(height[i],height[j]))*(m-n);
ans = Math.max(ans,area);
}
}
return ans;
}
}
PS.但是由于每个围成的矩形的面积都需要遍历到,而且矩形遍历的次数根据数组的元素个数成指数倍增长,所以一般来说会超时。
- 【2】使用双指针来做:
双指针是解决优化双重for循环问题的一种常用方法,可以省去较多不必要的计算:
首先我们能够知道的是
1.矩形面积仅受限于较小的那条边
2.矩形两边相同的情况下两边的距离越远越好
所以我们可以先让矩形的两边从中间移动,每次移动矩形的较小的那条边,仅将移动后形成矩形面积与已知的矩形面积进行比较。
这样做的好处是省略了中间不必要的面积计算,对于整个数组的遍历相当于只遍历了一遍。
class Solution {
public int maxArea(int[] height) {
int l = 0;
int r = height.length - 1;
int res = Math.min(height[l],height[r])*(r-l);
while(l<r){
if(height[l]<=height[r]){
l++;
}else{
r--;
}
int temp = Math.min(height[l],height[r])*(r-l);
res=Math.max(res,temp);
}
return res;
}
}
PS.此处使用while循环来确定遍历的次数。