zoukankan      html  css  js  c++  java
  • 数组中的逆序对

    原文地址:https://www.jianshu.com/p/38433a114b90

    时间限制:2秒 空间限制:32768K

    题目描述

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。

    输入描述:

    题目保证输入的数组中没有的相同的数字。
    数据范围:
    对于%50的数据,size<=10^4
    对于%75的数据,size<=10^5
    对于%100的数据,size<=2*10^5

    输入

    1,2,3,4,5,6,7,0

    输出

    7

    我的代码

    class Solution {
    public:
        int InversePairs(vector<int> data) {
            if(data.size()<2)
                return 0;
            vector<int> data_copy(data.size(),0);//辅助数组
            return InversePairsCore(data,data_copy,0,data.size()-1);
        }
        //归并思想
        int InversePairsCore(vector<int> &arr,vector<int> &arr_,
                            int begin, int end){
            if(begin==end){
                arr_[begin]=arr[begin];
                return 0;
            }
            int len=(end-begin)/2;
            int left=InversePairsCore(arr,arr_,begin,begin+len);
            int right=InversePairsCore(arr,arr_,begin+len+1,end);
            int i=begin+len,j=end,k=end;
            int count=0;
            while((i>=begin)&&(j>begin+len)){
                if(arr[i]>arr[j]){
                    arr_[k--]=arr[i--];
                    count+=j-begin-len;
                    if(count>1000000007)
                        count%=1000000007;
                }
                else
                    arr_[k--]=arr[j--];
            }
            while(i>=begin)
                arr_[k--]=arr[i--];
            while(j>begin+len)
                arr_[k--]=arr[j--];
            for(int i=begin;i<=end;i++)
                arr[i]=arr_[i];
            return (left+right+count)%1000000007;
        }
    };
    

    运行时间:107ms
    占用内存:4444k

  • 相关阅读:
    控制流程
    表达式
    2020.2.7
    寒假自学进度六
    2020.2.6
    2020.2.5
    寒假自学进度五
    Scala初级实验
    寒假自学进度四
    Spark运行基本流程
  • 原文地址:https://www.cnblogs.com/cherrychenlee/p/10822286.html
Copyright © 2011-2022 走看看