42. Trapping Rain Water

/* accetion of mine*/
class Solution {
public:
int trap(vector<int>& height) {
return help(0, height.size() - 1, height);
}


int help(int start,int end, vector<int>& height)
{
if (end- start<2) return 0;
int ans = 0;
int i = start;
int j = 0;
for (;i<=end;)
{
if (height[i] == 0) { i = i + 1;continue; };
j = i + 1;
if (j<=end && height[j]>height[i]) { i = i + 1;continue; };

while (j <=end && height[j] < height[i])
{
++j;
}
if (j > end) j = j - 1;
if (j - i <2) { i = i + 1; continue; };

if (j <= end && height[j] >= height[i])
{
for (int k = i;k <= j;k++)
{
//ans += height[k] - height[i] > 0 ? height[k] - height[i] : 0;
ans += height[i] - height[k] > 0 ? height[i] - height[k] : 0;
}
ans += help(j, end, height);
return ans;
}
//if (j - i == 2) { return abs(height[j] - height[j - 1]); };
if (j - i == 2) { return height[j] - height[j - 1]>0? height[j] - height[j - 1]:0; };

int max_value = INT_MIN;
int second_max_value = max_value;
int max_index = -1;
int seconde_max_index = -1;
for (int k = i;k <= j;k++)
{
if (height[k] > max_value) {
seconde_max_index = max_index;
second_max_value = max_value;

max_value = height[k];
max_index = k;
}
else
{
if (height[k] > second_max_value)
{
second_max_value = height[k];
seconde_max_index = k;
}
}
}
if (seconde_max_index == j)
{
for (int k = i+1;k <= seconde_max_index;k++)
{
ans += abs(height[seconde_max_index]- height[k]);
}
return ans;
}


return help(i, seconde_max_index, height) + help(seconde_max_index, end, height);
}
return ans;
}
};
// brute force
int trap(vector<int>& height)
{
    int ans = 0;
    int size = height.size();
    for (int i = 1; i < size - 1; i++) {
        int max_left = 0, max_right = 0;
        for (int j = i; j >= 0; j--) { //Search the left part for max bar size
            max_left = max(max_left, height[j]);
        }
        for (int j = i; j < size; j++) { //Search the right part for max bar size
            max_right = max(max_right, height[j]);
        }
        ans += min(max_left, max_right) - height[i];
    }
    return ans;
}



// dynamic Programming 
int trap(vector<int>& height)
{
if(height == null)
return 0;
    int ans = 0;
    int size = height.size();
    vector<int> left_max(size), right_max(size);
    left_max[0] = height[0];
    for (int i = 1; i < size; i++) {
        left_max[i] = max(height[i], left_max[i - 1]);
    }
    right_max[size - 1] = height[size - 1];
    for (int i = size - 2; i >= 0; i--) {
        right_max[i] = max(height[i], right_max[i + 1]);
    }
    for (int i = 1; i < size - 1; i++) {
        ans += min(left_max[i], right_max[i]) - height[i];
    }
    return ans;
}
/* others two Pointer*/
int trap(vector<int>& height)
{
    int left = 0, right = height.size() - 1;
    int ans = 0;
    int left_max = 0, right_max = 0;
    while (left < right) {
        if (height[left] < height[right]) {
            height[left] >= left_max ? (left_max = height[left]) : ans += (left_max - height[left]);
            ++left;
        }
        else {
            height[right] >= right_max ? (right_max = height[right]) : ans += (right_max - height[right]);
            --right;
        }
    }
    return ans;
}

/*

[4,2,3] is KO 0,should be 1
class Solution {
public:
int trap(vector<int>& height) {
if (height.size()<3) return 0;
int i = 0;
int j = 0;
int ans = 0;
for (i = 0; i<height.size()-1;)                   //in fact i<height.size()-2 is OK, because size()-3,size()-2,size()-1 can be three numbers;
{
if (height[i] == 0) { i = i + 1;continue; };
j = i + 1;
if (height[j]>height[i]) { i = i + 1;continue; };   // if not descrease continue;
//int start = i;
while (j<height.size() && height[j]<height[i]) { ++j; };  
if (j == height.size()) { i = i + 1; continue; };
//int end = j;
if (j - i<2) { i = i + 1; continue; };
for (int start = i + 1; start<j;start++)
{
ans += height[i] - height[start];
}
i = j;
}


return ans;
}
};
*/
/* [5,2,1,2,1,5] is KO 2, should be 14*/
/*
class Solution {
public:
int trap(vector<int>& height) {
if (height.size()<3) return 0;
int i = 0;
int j = 0;
int ans = 0;
for (i = 0; i<height.size()-1;)
{
if (height[i] == 0) { i = i + 1;continue; };
j = i + 1;
if (height[j]>height[i]) { i = i + 1;continue; };
while (j<height.size() && height[j]<height[j-1]) { ++j; };
if (j == height.size()) { i = i + 1; continue; };

while (j+1<height.size() && height[j + 1]>height[j]) { ++j; };
//if (j+1 == height.size()) { i = i + 1;continue; };
int start = i; 
int end = j;

if (end - start <2) { i = i + 1; continue; };
int max_use_height = height[start] > height[end] ? height[end] : height[start];

for (int k = start; k<=end;k++)
{
ans += (max_use_height- height[k])>0? max_use_height - height[k]:0;
}

i = j;
}


return ans;
}
};
*/
/*[5,4,1,2] 3 should be 1*/
/*
class Solution {
public:
int trap(vector<int>& height) {
if (height.size()<3) return 0;
int i = 0;
int j = 0;
int ans = 0;
for (i = 0; i<height.size() - 1;)
{
if (height[i] == 0) { i = i + 1;continue; };
j = i + 1;
if (height[j]>height[i]) { i = i + 1;continue; };

int max_used_value =height[j];
int max_used_index = j;


int start = i;
int end = j;
while (j < height.size() && (height[j]<height[i]))
{
if (height[j] > max_used_value)
{
max_used_index = j;
max_used_value = height[j];
}
++j;
}
//if (j == height.size()) { i = i + 1;continue; };
end = max_used_index + 1;
//if (height[j - 1] >= height[i])
if (j<height.size() && height[j] >= height[i])
{
max_used_index = i;
max_used_value = height[i];
end = j;
}


//if (j+1 == height.size()) { i = i + 1;continue; };



if (end - start <2) { i = i + 1; continue; };


for (int k = start; k <=end &&k<height.size();k++)
{
ans += (max_used_value - height[k])>0 ? max_used_value - height[k] : 0;
}


i = j;
}


return ans;
}
};
*/
/*[0,7,1,4,6] runtime error*/
/*
class Solution {
public:
int trap(vector<int>& height) {
return help(0, height.size() - 1, height);
}


int help(int start,int end, vector<int>& height)
{
if (end- start<2) return 0;
int ans = 0;
int i = start;
int j = 0;
for (;i<=end;)
{
if (height[i] == 0) { i = i + 1;continue; };
j = i + 1;
if (j<=end && height[j]>height[i]) { i = i + 1;continue; };

while (j <=end && height[j] < height[i])
{
++j;
}
if (j > end) j = j - 1;
if (j - i <2) { i = i + 1; continue; };

if (j <= end && height[j] >= height[i])
{
for (int k = i;k <= j;k++)
{
//ans += height[k] - height[i] > 0 ? height[k] - height[i] : 0;
ans += height[i] - height[k] > 0 ? height[i] - height[k] : 0;
}
ans += help(j, end, height);
return ans;
}
if (j - i == 2) { return abs(height[j] - height[j - 1]); };

int max_value = INT_MIN;
int second_max_value = max_value;
int max_index = -1;
int seconde_max_index = -1;
for (int k = i;k <= j;k++)
{
if (height[k] > max_value) {
seconde_max_index = max_index;
second_max_value = max_value;

max_value = height[k];
max_index = k;
}
else
{
if (height[k] > second_max_value)
{
second_max_value = height[k];
seconde_max_index = k;
}
}
}


return help(i, seconde_max_index, height) + help(seconde_max_index, end, height);
}
return ans;
}
};
*/


/* [4,4,4,7,1,0] output 1,shoudl be 0*/
/*
class Solution {
public:
int trap(vector<int>& height) {
return help(0, height.size() - 1, height);
}


int help(int start,int end, vector<int>& height)
{
if (end- start<2) return 0;
int ans = 0;
int i = start;
int j = 0;
for (;i<=end;)
{
if (height[i] == 0) { i = i + 1;continue; };
j = i + 1;
if (j<=end && height[j]>height[i]) { i = i + 1;continue; };

while (j <=end && height[j] < height[i])
{
++j;
}
if (j > end) j = j - 1;
if (j - i <2) { i = i + 1; continue; };

if (j <= end && height[j] >= height[i])
{
for (int k = i;k <= j;k++)
{
//ans += height[k] - height[i] > 0 ? height[k] - height[i] : 0;
ans += height[i] - height[k] > 0 ? height[i] - height[k] : 0;
}
ans += help(j, end, height);
return ans;
}
if (j - i == 2) { return abs(height[j] - height[j - 1]); };

int max_value = INT_MIN;
int second_max_value = max_value;
int max_index = -1;
int seconde_max_index = -1;
for (int k = i;k <= j;k++)
{
if (height[k] > max_value) {
seconde_max_index = max_index;
second_max_value = max_value;

max_value = height[k];
max_index = k;
}
else
{
if (height[k] > second_max_value)
{
second_max_value = height[k];
seconde_max_index = k;
}
}
}
if (seconde_max_index == j)
{
for (int k = i+1;k <= seconde_max_index;k++)
{
ans += abs(height[seconde_max_index]- height[k]);
}
return ans;
}


return help(i, seconde_max_index, height) + help(seconde_max_index, end, height);
}
return ans;
}
};
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值