题解 | #盛水最多的容器#
盛水最多的容器
https://www.nowcoder.com/practice/3d8d6a8e516e4633a2244d2934e5aa47?tpId=196&tqId=39308&ru=/exam/oj
int min(int a, int b) { return a < b ? a : b; } int max(int a, int b) { return a > b ? a : b; } int maxArea(int* height, int heightSize) { int left = 0; int right = heightSize - 1; int res = 0; while (left < right) { int cur_area = min(height[left], height[right]) * (right - left); res = max(res, cur_area); if (height[left] < height[right]) { left++; } else { right--; } } return res; }
// 双指针技巧,移动较低的一边 if (height[left] < height[right]) { left++; } else { right--; }
其实也好理解,因为矩形的高度是由 min(height[left], height[right])
即较低的一边决定的:
你如果移动较低的那一边,那条边可能会变高,使得矩形的高度变大,进而就「有可能」使得矩形的面积变大;相反,如果你去移动较高的那一边,矩形的高度是无论如何都不会变大的,所以不可能使矩形的面积变得更大。
详细题解:如何高效解决接雨水问题