zoukankan      html  css  js  c++  java
  • 【lintcode】Count of Smaller Number before itself

    http://www.lintcode.com/en/problem/count-of-smaller-number-before-itself/

    这道题目是动态添加线段树的元素,然后再查询。

    数据集和描述不相符,坑

    class Solution {
    public:
       /**
         * @param A: An integer array
         * @return: Count the number of element before this element 'ai' is 
         *          smaller than it and return count number array
         */
        // 线段树,动态添加的意思,每次向线段树里面添加一个数,接着再查询一个区间
        // 有多少个数
        // 很巧妙,是动态的去做,不是做好再静态查找
        
        class TreeNode{
        public:
            TreeNode(int _start, int _end) :
                start(_start), end(_end), left(nullptr), right(nullptr),
                cnt(0) {}
        
            int start, end;
            TreeNode *left, *right;
            int cnt;
        };
        
        TreeNode *build(int start, int end){
            if (start > end) return nullptr;
            if (start == end) return new TreeNode(start, end);
            
            int mid = start + ((end - start) >> 1);
            
            auto root = new TreeNode(start, end);
            root->left = build(start, mid);
            root->right = build(mid + 1, end);
            
            return root;
        }
        
        void modify(TreeNode *root, int idx){
            if (root == nullptr) return;
            
            if (root->start == root->end && root->start == idx){
                ++(root->cnt);
                return;
            }
            
            int mid = root->start + ((root->end - root->start) >> 1);
            if (mid >= idx) modify(root->left, idx);
            else modify(root->right, idx);
            
            root->cnt = root->left->cnt + (root->right ? root->right->cnt : 0);
        }
        
        int query(TreeNode *root, int start, int end){
            if (root->end < start || root->start > end) return 0;
            if (root->start >= start && root->end <= end)
                return root->cnt;
                
            int mid = root->start + ((root->end - root->start) >> 1);
            if (mid >= end) return query(root->left, start, end);
            if (mid < start) return query(root->right, start, end);
            
            int leftRes = query(root->left, start, mid);
            int rightRes = query(root->right, mid + 1, end);
            
            return leftRes + rightRes;
        }
        
        // 这个题有超出范围的数据... 坑...
        vector<int> countOfSmallerNumberII(vector<int> &A) {
            // write your code here
            TreeNode *root = build(0, 20000);
            vector<int> res;
            
            for (auto n : A){
                auto cnt = query(root, 0, n - 1);
                res.push_back(cnt);
                modify(root, n);
            }
            
            return res;
        }
    };
  • 相关阅读:
    HTTP Caching
    有关缓存的那些事 读 PHP高级编程
    用embercli 学习搭建了todoMVC
    redis数据结构开篇
    linux最小安装后进行的操作
    redis数据结构整数集合
    redis数据结构动态字符串(SDS)
    redis数据结构压缩列表
    redis数据结构字典
    redis数据结构跳跃表
  • 原文地址:https://www.cnblogs.com/EpisodeXI/p/4585770.html
Copyright © 2011-2022 走看看