Leetcode 42. 接雨水(DAY 62) ---- 动态规划学习期


原题题目


在这里插入图片描述


代码实现(思路启发后自解)


int trap(int* height, int heightSize){
    int leftdp[heightSize+1],rightdp[heightSize+1],i,temp,sum = 0;
    memset(leftdp,0,sizeof(leftdp));
    memset(rightdp,0,sizeof(rightdp));
    for(i=1;i<heightSize;i++)
    {
        temp = leftdp[i-1] + height[i-1] - height[i];
        leftdp[i] = temp>0 ? temp : 0;
    }

    for(i=heightSize-2;i>=0;i--)
    {
        temp = rightdp[i+1] + height[i+1] - height[i];
        rightdp[i] = temp>0 ? temp : 0;
        sum += fmin(rightdp[i],leftdp[i]);
    }

代码实现(二刷DAY 99 看了一解的提示 刷出来的 第一眼看到想到的两边遍历 但没想出来方法)


class Solution {
public:
    int trap(vector<int>& height) {
        int size = height.size(),ret = 0;
        vector<int> leftdp(size,0),rightdp(leftdp);

        for(int i=1;i<size;++i)
        {
            int temp = leftdp[i-1] + height[i-1] - height[i];
            leftdp[i] = temp>0 ? temp : 0;
        }

        for(int i=size-2;i>=0;--i)
        {
            int temp = rightdp[i+1] + height[i+1] - height[i];
            rightdp[i] = temp>0 ? temp : 0;
            ret += min(rightdp[i],leftdp[i]);
        }
        return ret;
    }
};

代码实现(三刷自解 DAY 166 C++)


class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> cntleft(height),cntright(height);
        int ret = 0;
        for(int i=1;i<height.size()-1;++i)
            cntleft[i] = max(cntleft[i-1],cntleft[i]);

        for(int i=height.size()-2;i>=1;--i)
            cntright[i] = max(cntright[i+1],cntright[i]);

        for(int i=1;i<height.size()-1;++i)
        {
            int tmp = min(cntleft[i],cntright[i]) - height[i]; 
            ret +=  tmp > 0 ? tmp : 0;    
        }   
        return ret;
    }
};

代码实现(四刷自解 DAY 207 C++)


class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> left(height.size(),0),right(left);

        int size = height.size();
        int left_max = 0;
        for(int i=0;i<size;++i)
        {
            left_max = max(left_max,height[i]);
            left[i] = left_max;
        }

        int right_max = 0;
        for(int i=size-1;i>=0;--i)
        {
            right_max = max(right_max,height[i]);
            right[i] = right_max;
        }

        int sum = 0;
        for(int i=0;i<size;++i)
            sum += (min(left[i],right[i]) - height[i]);
        return sum;
    }
};

代码实现(五刷自解 DAY 274 C++)


class Solution {
public:
    int trap(vector<int>& height) {
      vector<int> left(height.size(), 0);
      vector<int> right(left);

      int size = height.size();
      int tmp = 0;
      for (int i = 0; i < size; ++i) {
        tmp = max(tmp , height[i]);
        left[i] = tmp;
      }

      tmp = 0;
      for (int i = size - 1; i >= 0; --i) {
        tmp = max(tmp , height[i]);
        right[i] = tmp;
      }

      int ans = 0;
      for (int i = 0; i < size; ++i) {
        ans += min(left[i], right[i]) - height[i]; 
      }
      return ans;
    }
};

代码实现(六刷自解 DAY 3 Golang)


func max(x, y int) int {
  if x >= y {
    return x
  } else {
    return y
  }
}

func trap(height []int) int {
  leftpos, rightpos, leftnum, rightnum := 0, len(height) - 1, height[0], height[len(height) - 1]
  ret := 0

  for leftpos <= rightpos {
    tmpleft, tmpright := height[leftpos], height[rightpos];
    leftnum, rightnum = max(leftnum, tmpleft), max(rightnum, tmpright)
    if leftnum <= rightnum {
      ret += leftnum - tmpleft
      leftpos++
    } else {
      ret += rightnum - tmpright
      rightpos--
    }
  } 
  return ret
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love 6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值