爨爨爨好

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

▶ 问题:给定数组 { 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 };

 

posted on 2017-12-27 21:02  爨爨爨好  阅读(159)  评论(0编辑  收藏  举报