力扣题 接雨水(困难)

个人思路为法一

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

int trap(int* height, int heightSize)
{    int total = 0;   
 short left = 0;   
  short right = heightSize - 1;   
   short tmph1 = 0;    
   short tmph2 = 0;        
   if (heightSize == 0)
    {       
    return 0;   
     }        
     tmph1 = height[left];   
      tmph2 = height[right];  
        while (left < right) 
        {     
           if (tmph1 < tmph2)
         {            left++;           
          tmph1 = tmph1 < height[left] ? height[left] : tmph1;   
                   total += (tmph1 - height[left]);        }
                    else {            right--;         
                       tmph2 = tmph2 < height[right] ? height[right] : tmph2;            
                       total += (tmph2 - height[right]);
                                    }   
                                      }       
                         return total;
                         }

思路:先找到最高的位置,然后左右分别遍历天坑,求和减去原始柱子高度和

#define MAX(a, b) (a) > (b) ? (a) : (b)
#define MIN(a, b) (a) < (b) ? (a) : (b)
int trap(int* height, int heightSize)
{int i = 0;
int j = 0;
int total = 0;
int max_left = 0;
int max_right = 0;
//右边最大值坐标
int max_r_index = 0;
int temp = 0;
for (i = 1; i < heightSize - 1; i++)
 {    //左边坐标不停右移,不需要循环遍历,比较最新的左边坐标和历史最高值即可  
   max_left = MAX(max_left, height[i - 1]);   
    //第一次进行遍历,以及右移之后,当最大值坐标超出最大值范围,再重新计算  
      if (max_right == 0 || i + 1 > max_r_index)
       {        max_right = 0;       
        for (j = i + 1; j < heightSize; j++) 
        {           
         if (max_right <= height[j])
         {              
           max_right = height[j];           
                max_r_index = j;            }   
                     }   
                      }     
                      temp = MIN(max_left, max_right); 
                         if (temp >= height[i]) 
                         {        total += (temp - height[i]);  
                           }
                           }
                           return total; 
                           }

对于数组中的每个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值