▶ 问题:给定数组 { ai,i = D1n },求 ( j - i ) * | aj - ai | 的最大值。
▶ 算法:考虑 ai 和 ai+1,若 ai ≥ ai+1 则显然选 ai 比选 ai+1 更好;若 ai < ai+1,则我们需要比较 ( j - i ) * | aj - ai | 和 ( j - i - 1 ) * | aj - ai+1 | 的大小,再在两项之间选择。同理考虑 aj 和 aj+1。我们使用两个指针,开始时分别指向数组的首元素和末元素,利用上述方法不断交替将两指针向内靠拢,并用一个整形变量记录这一过程中能够达到的面积的最大值,当两指针重叠时,靠拢结束,输出记录的面积值。
● 代码,19 ms,最快的解法算法与之相同
1 class Solution 2 { 3 public: 4 int maxArea(vector<int>& height) 5 { 6 int output = 0, temp, old; 7 for (int i = 0, j = height.size() - 1; i < j;) 8 { 9 temp = (j - i)*(height[i] < height[j] ? height[i] : height[j]); 10 output = output > temp ? output : temp; 11 if (height[i]<height[j]) 12 for (old = height[i]; i < j && height[i] <= old; ++i); 13 else 14 for (old = height[j]; i < j && height[j] <= old; --j); 15 } 16 return output; 17 } 18 };