zoukankan      html  css  js  c++  java
  • LC 493. Reverse Pairs

    link

     Fenwick Tree:

    class Solution {
    public:
        int n;
        int reversePairs(vector<int>& nums) {
            n=nums.size();
            vector<int> copy=nums;
            sort(copy.begin(),copy.end());
            vector<int> fenwick(n+1);
            int res=0;
            for(int i=n-1;i>=0;i--){
                int idx=binarysearch(copy,nums[i]);
                if(idx>=0){
                    res+=query(fenwick,idx);
                }
                int curidx=binarysearch2(copy,nums[i]);
                update(fenwick,curidx);
            }
            return res;
        }
        
        int query(vector<int>& fenwick, int idx){
            idx++;
            int res=0;
            while(idx>=1){
                res+=fenwick[idx];
                idx-=(idx&-idx);
            }
            return res;
        }
        
        void update(vector<int>& fenwick, int idx){
            idx++;
            while(idx<=n){
                fenwick[idx]++;
                idx+=(idx&-idx);
            }
        }
        
        int binarysearch(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if((long long)2*copy[mid]<val){
                    left=mid+1;
                }else right=mid-1;
            }
            return right;
        }
        
        int binarysearch2(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if(copy[mid]>=val) right=mid-1;
                else left=mid+1;
            }
            return left;
        }
    };

    segment tree:

    class Solution {
    public:
        int n;
        vector<int> seg;
        int reversePairs(vector<int>& nums) {
            n=nums.size();
            vector<int> copy=nums;
            sort(copy.begin(),copy.end());
            seg=vector<int>(n<<2);
            int res=0;
            for(int i=n-1;i>=0;i--){
                int lastidx=binarysearch(copy,nums[i]);
                if(lastidx>=0){
                    res+=query(0,0,n-1,0,lastidx);
                }
                int curidx=binarysearch2(copy,nums[i]);
                update(0,0,n-1,curidx);
            }
            return res;
        }
        
        int query(int idx, int left, int right, int qleft, int qright){
            if(qleft>right || qright<left) return 0;
            if(qleft<=left && qright>=right) return seg[idx];
            int mid=left+(right-left)/2;
            int l=query(idx*2+1,left,mid,qleft,qright);
            int r=query(idx*2+2,mid+1,right,qleft,qright);
            return l+r;
        }
        
        void update(int idx, int left, int right, int targetidx){
            if(left>targetidx || right<targetidx) return;
            if(left==right){
                seg[idx]++;
                return;
            }
            int mid=left+(right-left)/2;
            update(idx*2+1,left,mid,targetidx);
            update(idx*2+2,mid+1,right,targetidx);
            seg[idx]=seg[idx*2+1]+seg[idx*2+2];
        }
        
        int binarysearch(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if((long long)2*copy[mid]<val){
                    left=mid+1;
                }else right=mid-1;
            }
            return right;
        }
        
        int binarysearch2(vector<int>& copy, int val){
            int left=0;
            int right=n-1;
            while(left<=right){
                int mid=left+(right-left)/2;
                if(copy[mid]>=val) right=mid-1;
                else left=mid+1;
            }
            return left;
        }
    };
  • 相关阅读:
    python抓取网页图片
    Socket通信之Java学习(一)
    python打包成window可执行程序
    linux下安装java
    SpringBoot系列:五、SpringBoot使用Actuator
    SpringBoot系列:四、SpringBoot集成JPA
    SpringBoot系列:三、SpringBoot中使用Filter
    SpringBoot系列:二、SpringBoot的配置文件
    SpringBoot系列:一、SpringBoot搭建
    .Net Core使用IConfiguration来处理Json文件
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12859219.html
Copyright © 2011-2022 走看看