• 315. 计算右侧小于当前元素的个数


    315. 计算右侧小于当前元素的个数

    给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。

    示例:

    输入: [5,2,6,1]
    输出: [2,1,1,0] 
    解释:
    5 的右侧有 2 个更小的元素 (2 和 1).
    2 的右侧仅有 1 个更小的元素 (1).
    6 的右侧有 1 个更小的元素 (1).
    1 的右侧有 0 个更小的元素.
    

    method: 归并数组索引的同时计算左侧数组上的元素的count值

    int cnt(vector<int>& nums, int st, int ed, int key,vector<int>& pos){
            // //降序排列,返回比k小的元素的个数
            if(st>ed)return 0;
            int mid=(st+ed)/2;
            if(nums[pos[mid]]>=key)return cnt(nums,mid+1,ed,key,pos);
            else return ed-mid+1+cnt(nums,st,mid-1,key,pos);
        }
        void merge(vector<int> &arr,int L,int mid,int R, vector<int>& pos, vector<int>& dp ){
            for(int i=L;i<=mid;i++){
                dp[pos[i]]+=cnt(arr,mid+1,R,arr[pos[i]],pos);
            }
            vector<int> help(R-L+1,0);
            //nt *help = new int[];
            int p1=L,p2=mid+1,i=0;
            while(p1<=mid && p2<=R)
            {
                help[i++] = arr[pos[p1]]<arr[pos[p2]] ? pos[p2++] : pos[p1++];
            }
            while(p1<=mid)
                help[i++] = pos[p1++];
            
            while(p2<=R)
                help[i++] = pos[p2++];
            
            for (int i=0;i<R-L+1;i++)
            {
                pos[L+i] = help[i];
            }
        }
        void sortprocess(vector<int> &arr,int L,int R, vector<int>& pos, vector<int>& dp)
        {
            if (L < R)
            {
                int mid = L + ((R-L)>>2);  //  (L+R)/2
                sortprocess(arr,L,mid,pos,dp);
                sortprocess(arr,mid+1,R,pos,dp);
                merge(arr,L,mid,R,pos,dp);
            }
        }
     
        void MergeSort(vector<int> &arr,int L,int R, vector<int>& pos, vector<int>& dp)
        {
            if (arr.size()<2)
                return;
            sortprocess(arr,L,R,pos,dp);
        }
        vector<int> countSmaller(vector<int>& nums) {
            int n=nums.size();
            if(n==0)return vector<int>();
            vector<int> pos(n,0);
            for(int i=0;i<n;i++)
                pos[i]=i;
            vector<int> dp(n,0);
            MergeSort(nums,0,n-1,pos,dp);
            return dp;
        }
  • 相关阅读:
    洛谷P1908 逆序对
    codevs1690 开关灯
    洛谷P1195 口袋的天空
    洛谷P1816 忠诚
    洛谷P1536 村村通
    洛谷P3045 [USACO12FEB]牛券Cow Coupons
    洛谷P1801 黑匣子_NOI导刊2010提高(06)
    洛谷P2947 [USACO09MAR]仰望Look Up
    Android(java)学习笔记51:ScrollView用法
    Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12720971.html
Copyright © 2020-2023  润新知