zoukankan      html  css  js  c++  java
  • *[codility]CartesianSequence

    https://codility.com/programmers/challenges/upsilon2012

    求笛卡尔树的高度,可以用单调栈来做。

    维持一个单调递减的栈,每次进栈的时候记录下它之后有多少元素,就是以它为根的子树的高度。出栈的时候再更新一次供新进栈者使用。

    int solution(vector<int> &A) {
        A.push_back(1000000001); // an element larger than any one in A
        int size = A.size();
        vector<int> elem_stack;
        vector<int> ht_stack;
        int tailHt = 0;
        for (int i = 0; i < size; i++) {
            bool done = false;
            while (not done) {
                if (elem_stack.size() == 0
                    || elem_stack.back() > A[i]) {
                    elem_stack.push_back(A[i]);
                    ht_stack.push_back(tailHt);
                    tailHt = 0;
                    done = true;
                } else { // pop up
                    elem_stack.pop_back();
                    tailHt = max(ht_stack.back(), tailHt) + 1;
                    ht_stack.pop_back();
                }
            }
        }
        return ht_stack.back();
    }
    

      

  • 相关阅读:
    Python GIL-------全局解释器锁
    JavaScript简介
    MongoDB查询
    创建、更新和删除文档
    MongoDB基础知识
    Linux安装mysql
    函数、变量、参数
    循环语句
    控制语句
    集合
  • 原文地址:https://www.cnblogs.com/lautsie/p/3984035.html
Copyright © 2011-2022 走看看