1. 程式人生 > >leetcode 315 計算右側小於當前元素個數 c++

leetcode 315 計算右側小於當前元素個數 c++

class Solution {
public:
    vector<int> countSmaller(vector<int>& nums) {
        vector<pair<int,int>>vec;
        vector<int>count;
        for(int i=0;i<nums.size();i++){
            vec.push_back(make_pair(nums[i],i));
            count.push_back(0);
        }
            merge_sort(vec,count);
            return count;
        
    }
private:
    void merge_sort_two_vec(vector<pair<int,int>>&sub_vec1,vector<pair<int,int>>&sub_vec2,vector<pair<int,int>>&vec,vector<int>&count){
        int i=0;
        int j=0;
        while(i<sub_vec1.size()&&j<sub_vec2.size()){
            if(sub_vec1[i].first<=sub_vec2[j].first){
                count[sub_vec1[i].second]+=j;
                vec.push_back(sub_vec1[i]);
                i++;
            }
            else{
                vec.push_back(sub_vec2[j]);
                j++;
            }
        }
        for(;i<sub_vec1.size();i++){
            count[sub_vec1[i].second]+=j;
            vec.push_back(sub_vec1[i]);
        }
        for(;j<sub_vec2.size();j++){
            vec.push_back(sub_vec2[j]);
        }
    }
    void merge_sort(vector<pair<int,int>>&vec,vector<int>&count){
        if(vec.size()<2){
            return;
        }
        int mid=vec.size()/2;
        vector<pair<int,int>>sub_vec1;
        vector<pair<int,int>>sub_vec2;
        for(int i=0;i<mid;i++){
            sub_vec1.push_back(vec[i]);
        }
        for(int i=mid;i<vec.size();i++){
            sub_vec2.push_back(vec[i]);
        }
        merge_sort(sub_vec1,count);
        merge_sort(sub_vec2,count);
        vec.clear();
        merge_sort_two_vec(sub_vec1,sub_vec2,vec,count);
    }
};