Leetcode Count of Smaller Numbers After Self

题意:给出一组数字,求出在每个数字之后比这个数小的数字的个数。

思路:这题用了分治的思想。将数组分成前后两部分来做,每一部分分别求出答案。在合并的时候,记录由后面的数组移动到前面的数组的数字的个数,这个数就是后面数组中比前面数组中比某个数小的数的个数。

class Solution {
public:

struct mynode {
    int val;
    int pos;
    int re;
};
    vector<int> countSmaller(vector<int>& nums) {
        vector<mynode> tempre;
        mynode ininode;
        for(int i = 0; i < nums.size(); ++ i) {
            ininode.val = nums[i];
            ininode.pos = i;
            ininode.re = 0;
            tempre.push_back(ininode);
        }
        
        tempre = merge(tempre);
        
        vector<int> re(nums.size(), 0);
        for(int i = 0; i < nums.size(); ++ i) {
            re[tempre[i].pos] = tempre[i].re;
        }
        
        return re;
    }
    
    vector<mynode> merge(vector<mynode> tomerge) {
        if(tomerge.size() == 1) {
            return tomerge;
        }
        
        int mid = (tomerge.size() - 1) / 2; //cout << mid << endl;
        
        vector<mynode> tempFront;
        vector<mynode> tempAfter;
        for(int i = 0; i <= mid; ++ i) tempFront.push_back(tomerge[i]);
        for(int i = mid + 1; i < tomerge.size(); ++ i) tempAfter.push_back(tomerge[i]);
        
        if(tempFront.size()) tempFront = merge(tempFront);
        if(tempAfter.size()) tempAfter = merge(tempAfter);
        
        int l = 0;
        int r = 0;
        
        vector<mynode> tempre;
        int count = 0;
        while(l < tempFront.size() || r < tempAfter.size()) { 
            if(l < tempFront.size() && r < tempAfter.size()) {
                if(tempFront[l].val <= tempAfter[r].val) {
                    tempFront[l].re += count;
                    tempre.push_back(tempFront[l]);
                    l ++;
                }
                else {
                    count ++;
                    tempre.push_back(tempAfter[r]);
                    r ++;
                }
                continue;
            }
            
            if(l < tempFront.size()) {
                tempFront[l].re += count;
                tempre.push_back(tempFront[l]);
                l ++;
                continue;
            }
            if(r < tempAfter.size()) {
                count ++;
                tempre.push_back(tempAfter[r]);
                r ++;
            }
        }
        
        return tempre;
    }
};

在类中也是可以定义结构体的。

猜你喜欢

转载自blog.csdn.net/markpen/article/details/54570877