您的位置:首页 > 移动开发

LeetCode: Trapping Rain Water

2014-06-23 13:44 225 查看
思路:

从当前位置pos的柱子开始,搜索后面的柱子A[k],k = pos+1,...,n,A[k]有两种情况:

1)A[k] >= A[pos],且k - pos > 1,此时组成一个“桶”,注意:此时他们的桶底是中间(pos 到 k中间)高度最高的柱子,桶底与这根柱子顶部平行,在这种情况下,就不用往后搜索了,因为A[k]阻止了A[pos]与后面的柱子形成通;

2) A[k] < A[pos],只要 k - pos >1,而且中间位置(pos 到 k)的最高的柱子不超过A[k],也能形成一个桶,当然这个情况下,还是向后搜索,因为此时A[k]不能阻止A[pos]与后面的柱子形成“桶”。

注意中间位置的高度的记录,每次保留已经搜索的最大值。

整个时间复杂度为O(n^2)。这个题有O(n)个解法,以后再来^_^.

code:

class Solution {
public:
int trap(int A[], int n) {
if(n<=1)return 0;
int sum = 0, midHeigh;
for(int i=0;i<n;i++){
midHeigh = 0;
for(int j=i+1;j<n;j++){
if(A[j] >= A[i]){  //第一种形成“桶”情况
sum += ((A[i] - midHeigh)*(j-1-i));
break;
}
else{ //第二种形成“桶”情况
if(A[j] > 0 && midHeigh < A[j])
sum += (A[j] - midHeigh)*(j-1-i);
midHeigh = max(midHeigh,A[j]);  //更新中间位置的柱子的最高高度
}
}
}
return sum;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: