day11.10

词法分析器写的还是没有问题滴,上午交了满分^_^。
今天的成果= = …有点少。
中午帮室友用他的思路写了一遍算法作业15个case wa了3个还是没AC…结果没睡觉困得一比

说下那道hard吧。Trapping Rain Water
题目在stack里,提示用栈。要想储存水那么必须是高低高这种形式。容易想到创建一个栈,让它保存降序序列,遇到比top大的就进行计算能存储水量water,然后相加得到解。但难点就是这个临时的water如何找到一个合理的计算方法能让他正好是一直累加就可以得到最后的值。直接高度相减乘距离是肯定不行的,因为可能后面的water会包含前边,这样就算多了。然后又想到分类,当遇到比栈中最大的时候怎么样,一般情况怎么样等等,还是不好处理。
最后终于想到了一个计算water的方法:降序入栈,遇到比top大的就判断它和栈中倒数第二个元素谁小,用小的和栈顶元素相减乘距离就得到这一小块的water了,如果没有倒数第二个栈中元素,那么直接water就加0(这时不会产生存储水空间,画个图就能发现),这样water累加就可以达到不重不漏。

class Solution {
public:
    int trap(vector<int>& height) {
        vector<pair<int, int>> v;
    for (int i = 0; i < height.size(); i++)
        v.push_back(pair<int, int>(height[i], i));
    int water = 0; 
    stack<pair<int, int>> s;
    for (int i = 0; i < v.size(); i++){
        if (s.empty() || v[i].first <= s.top().first)
            s.push(v[i]);
        else{
            while (!s.empty() && v[i].first>s.top().first){
                int tmp=s.top().first;
                s.pop();
                if (s.empty())
                    break;
                else
                //看该数前边的那个和V[i]谁大,用小的那个去算一小块面积,这样就可以累加了
                    water += (min(s.top().first, v[i].first)-tmp)*(v[i].second - s.top().second-1);
            }
            s.push(v[i]);
        }
    }
    return water;
    }
};

明天数组那几道写了,再写几题stack和Tree。然后把计网作业做了 差不多~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值