代码改变世界

leetcode - Container With Most Water

2013-03-26 22:48  张汉生  阅读(173)  评论(0编辑  收藏  举报

题目链接:http://oj.leetcode.com/problems/container-with-most-water/

第一个解法是用两个数组双向记录。方法的时间复杂度是O(n+max)。这里的max是height的最大值。当时没有想到用双向遍历的方法去做。【貌似第一遍leetcode中还从来没有用过双向遍历】

 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 max=-1;
 7     int * ar;
 8     int n = height.size();
 9     ar = new int[n];
10     vector<int>::iterator ii;
11     int i=0;
12     for (ii= height.begin(); ii!=height.end();ii++, i++){
13       if (*ii>max)
14         max = *ii;
15       ar[i] = *ii;
16     }
17     int * f, *g;
18     f = new int[max+1];
19     g = new int [max+1];
20     for (i=0; i<=max; i++){
21       f[i]=-1;
22       g[i]=-1;
23     }
24     int j;
25     for (i=0; i<n; i++){
26       j = ar[i];
27       while(j>=0 && f[j]==-1){
28         f[j] = i;
29         j--;
30       }
31     }
32     for (i=n-1; i>=0; i--){
33       j = ar[i];
34       while (j>=0 && g[j]==-1){
35         g[j] = i;
36         j--;
37       }
38     }
39     int area = 0;
40     for (i=0; i<n; i++){
41       if (g[ar[i]]>i){
42         int ta = (g[ar[i]]-i)*ar[i];
43         if (ta>area)
44           area = ta;
45       }
46     }
47     for (i=n-1; i>=0; i--){
48       if (f[ar[i]]<i){
49         int ta = (i-f[ar[i]])*ar[i];
50         if (ta>area)
51             area = ta;
52         }
53     }
54     delete []ar;
55     delete []f;
56     delete []g;
57     return area;
58   }
59 };

 双向遍历的算法倒是很简单:

 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 l=0, r = height.size()-1;
 7     int area = 0;
 8     while (l<r){
 9         int t = (r-l)*min(height[l], height[r]);
10         if (t>area)
11             area = t;
12         if (height[l]<height[r])
13             l++;
14         else r--;
15     }
16     return area;
17   }
18 };

不仅复杂度降为O(n),代码量更是大大的少了。

至于证明。你懂的。