[LeetCode] Container With Most Water


Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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.

類似於2Sum的思想,兩邊設一個指針,然后計算area,如果height[i] <= height[j],那么i++,因為在這里height[i]是瓶頸,j往里移只會減少面積,不會再增加area。

這是一個貪心的策略,每次取兩邊圍欄最矮的一個推進,希望獲取更多的水。

一個不嚴格的證明:

當height[i] <= height[j]時,為什么是i++,而不是j++來獲取可能更多的水?

假設j' > j,之所以j'往左移,是因為存在height[i'] > height[j'] (i’ <= i), 而那時area' = (j' - i') * min(height[i'], height[j']),

因為height[j'] == min(height[i'], height[j']),所以area' = (j' - i') * height[j']。

而i 和 j'構成的面積area = (j' - i) * min(height[i], height[j'])。

area' >= area,所以j不需要往右移。

 1 class Solution {
 2 public:
 3     int maxArea(vector<int> &height) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         int i = 0;
 7         int j = height.size() - 1;
 8         
 9         int ret = 0;
10         while(i < j)
11         {
12             int area = (j - i) * min(height[i], height[j]);
13             ret = max(ret, area);
14             
15             if (height[i] <= height[j])
16                 i++;
17             else
18                 j--;
19         }
20         
21         return ret;
22     }
23 };

時間復雜度O(n)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM