剑指offer 40.数组的逆序对

  1. 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
  2. 思路:
    1. 归并排序的思路,在归并的过程中,数组A(l , mid)和数组B(mid+1, r)进行归并
    2. A的index为i,B的index为j,一旦j位置的数字更小,那么i之后到mid的都和j组成的逆序对
  3. 启发或者坑
    1. 最终的结果记得要%N
    2. debug可以从小的vector开始,更快速地理清楚思路
  4. 代码
    class Solution {
    public:
        int res;
        vector<int> values;
        int InversePairs(vector<int> data) {
            //对mergesort进行变形即可
            res = 0;
            for (int i = 0; i < data.size(); i++)
                values.push_back(data[i]);
            mergesort(0, data.size()-1);
            return res%1000000007;
        }
        
        void mergesort(int l, int r) {
            if (l == r)
                return;
            int mid = (l+r)/2;
            mergesort(l, mid);
            mergesort(mid+1, r);
            merge(l, mid, mid+1, r);
        }
        
        void merge(int l1, int r1, int l2, int r2) {
            //cout << "merge:" << l1 << " " << r2 <<endl;
            int i = l1;
            int j = l2;
            vector<int> temp;
            while (i <= r1 && j <= r2) {
                if (values[i] <= values[j]) {
                    temp.push_back(values[i]);
                    i++;
                } else {
                    temp.push_back(values[j]);
                    if (res >= 1000000007)
                        res = res%1000000007;
                    res+=(r1-i+1);
                    //cout << "res: " << res << endl;
                    j++;
                }
            }
            if (i > r1) {
                while(j<=r2) {
                    temp.push_back(values[j]);
                    j++;
                }
            } else {
                while(i<=r1) {
                    temp.push_back(values[i]);
                    i++;
                }
            }
            for (int i = l1; i <= r2; i++) {
                values[i] = temp[i-l1];
                //cout << values[i] << " ";
            }
            //cout << endl;
        }
    };
    
发布了131 篇原创文章 · 获赞 5 · 访问量 7386

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/103892197