给定数组,?1−??
找出其中两个元素形成一个木桶,求木桶最多能装多少水
S= ??∗??−??, ??< ??
最慢的方法 O?2: 进行二层循环,计算出每一个的容量
改进:从??−??由大到小进行循环,若是??大于目前的最大值的??
底从高到低,先计算同底所有的,然后进入更小的底
记录下当前的最高行。如果行高小于最高行,则不计算,进入下一个循环
所以最后的代码:
int maxArea(vector<int>& heights) {
int size = heights.size();
int len = size - 1;
int maxHeight = 0;
int maxArea = 0;
int height = 0;
int area = 0;
for(; len > 0; len--){
for(int i = 0; i + len < size; i++){
height = heights[i] <= heights[i+len] ?
heights[i]: heights[i+len];
if(height <= maxHeight) continue;
if(height*len > maxArea){
maxArea = height*len;
maxHeight = height;
}
}
}
return maxArea;
}
代码一次通过,结果不出所料,惨不忍睹。
执行用时 : 2528 ms, 在Container With Most Water的C++提交中击败了0.99% 的用户
内存消耗 : 10.1 MB, 在Container With Most Water的C++提交中击败了0.96% 的用户
问题出在算法就算避免了运算,但是运算本来没多少次,而且很简单需要的时间很少,而时间复杂度还是 O?2。
官方题解: On
双指针法,开头结尾各一个指针。计算区域,然后将短的指针往长的指针方向移动一格,计算区域,直到两者相遇。移动短的用来平衡短的对面积的限制,从而保证一定可以得到最优解。
完成代码
int maxArea(vector<int>& heights) {
int i = 0;
int j = heights.size()-1;
int maxArea = 0;
int height = 0;
int area = 0;
while(i < j){
if(heights[i] > heights[j]){
area = (j-i)*heights[j];
j--;
}else{
area = (j-i)*heights[i];
i++;
}
maxArea = max(maxArea, area);
}
return maxArea;
}
执行用时 : 40 ms, 在Container With Most Water的C++提交中击败了38.45% 的用户
内存消耗 : 9.9 MB, 在Container With Most Water的C++提交中击败了0.96% 的用户