Container With Most Water Problem:
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container.
Analysis:
The wooden barrel principle, the bucket of water storage depends on the shortest board. //木桶原理,水桶中的存水量取决于短板。
step i: set two pointer istart and iend to point the current working min and max index of the array, initialize them as: istart = 0, iend = height.size() - 1;
step ii. when the lower index istart is less than the higher index iend, move the "short board" to gain the volume of the new container, likewise: the area = min(height[istart], height[iend]) * (iend - istart); otherwise, return the larger volume between the current max volume and the volume of the new container;
step iii.do step ii till istart less than iend;
So the c++sourcecode:
#include <vector>//vector
using std::vector;
#include <limits.h>//INT_MIN
#include <windows.h>//min, max
int maxArea(vector<int> &height) {
int istart = 0, iend = height.size()-1;
int result = INT_MIN;
while (istart < iend) {
int area = min(height[istart], height[iend]) * (iend - istart);
result = max(result, area); // Error code: int reslut = max(result, area); redefinition the global variable as a Local variable
if (height[istart] <= height[iend]) {
++istart;
}else {
--iend;
}
}
return result;
}
What I have learnt from this problem
- when using global variable, you should be initialize it and must mind where you use it, use it correct. Don't redefinition it as a Local variable, never do it again;
- draw a mind map in your paper to think very clearly before you coding;
- C++ allow program redefine the variable in the inner scope that have already defined in the outer scope, so this is a trip when you have no idea about the mechanism.