归并排序应用——逆序对

来源:互联网 发布:etet55最新域名 编辑:程序博客网 时间:2024/06/15 01:34

题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007(来源于剑指offer)
题目解析:正常做法逐个扫描时间复杂度O(n^2)肯定不行。就要找规律,这道题目是关于逆序对的,那么排序好的就不需要统计,当所有的数都排序好后(增序)这道题目也就完成了。所以这是一道排序的题目。可以降低时间复杂度,并且相互之间有序的排序算法就是归并排序。

class Solution {public:    int InversePairs(vector<int> data) {        if(data.size()<2)            return 0;        vector<int> copy(data.size());        int sum = 0;        InversePairCore(data, copy, sum, 0, data.size()-1);        return sum%1000000007;    }    void InversePairCore(vector<int> &data, vector<int>& copy, int &sum, int s, int e) {        if(s<e) {            int mid = (s+e)/2;            InversePairCore(data, copy, sum, s, mid);            InversePairCore(data, copy, sum, mid+1, e);            //排序 统计            int i=mid, j=e, k=e;            while(i>=s && j>=mid+1) {                if(data[i]>data[j]) {                    sum = (sum + (j-mid))%1000000007;                    copy[k--] = data[i--];                }                else {                    copy[k--] = data[j--];                }            }            while(i>=s)                copy[k--] = data[i--];            while(j>=mid+1)                copy[k--] = data[j--];            for(i=s; i<=e; i++) {                data[i] = copy[i];            }        }    }};
原创粉丝点击