day11.10

来源:互联网 发布:高中物理视频教学软件 编辑:程序博客网 时间:2024/06/08 06:24

词法分析器写的还是没有问题滴,上午交了满分^_^。
今天的成果= = …有点少。
中午帮室友用他的思路写了一遍算法作业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
原创粉丝点击