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

    中等  通过率:16.27%  时间限制:3秒  空间限制:64M
     
    知识点数组
    • 题目
    • 题解(42)
    • 讨论(850)
    • 排行

    描述

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

    对于50\%50%的数据,sizeleq 10^4size104
    对于100\%100%的数据,sizeleq 10^5size105

    输入描述:

    题目保证输入的数组中没有的相同的数字

    示例1

    输入:
    [1,2,3,4,5,6,7,0]
    返回值:
    7
    
     
     
    class Solution {
    public:
        const int kmod = 1000000007;
        
        int InversePairs(vector<int> data) {
            int ret = 0;
            merge_sort(data,0,data.size()-1,ret);
            return ret;
        }
        
        void merge_sort(vector<int>&arr,int l,int r,int &ret){
            if(l >= r) return;
            
            int mid = l + ((r-l)>>1);
            merge_sort(arr, l, mid, ret);
            merge_sort(arr, mid+1, r, ret);
            merge_two(arr,l,mid,r,ret);
        }
        
        void merge_two(vector<int>&arr,int l,int mid,int r,int &ret){
            vector<int> temp(r-l+1);
            int i=l,j=mid+1,k=0;
            
            while(i <= mid && j <= r){
                if(arr[i] > arr[j]){
                    temp[k++] = arr[j++];
                    ret += (mid-i+1);
                    ret %= kmod;
                }
                else{
                    temp[k++] = arr[i++];
                }
            }
            while(i <= mid){
                temp[k++] = arr[i++];
            }
            while(j <= r){
                temp[k++] = arr[j++];
            }
            
            for(k=0,i=l;i <= r;++i,++k){
                arr[i] = temp[k];
            }
        }
    };

    _____________

    如果两个区间为[4, 3] 和[1, 2]
    那么逆序数为(4,1),(4,2),(3,1),(3,2),同样的如果区间变为有序,比如[3,4] 和 [1,2]的结果是一样的,也就是说区间有序和无序结果是一样的。
    但是如果区间有序会有什么好处吗?当然,如果区间有序,比如[3,4] 和 [1,2]
    如果3 > 1, 显然3后面的所有数都是大于1, 这里为 4 > 1, 明白其中的奥秘了吧。所以我们可以在合并的时候利用这个规则。

  • 相关阅读:
    转 [ javascript面向对象技术
    制作双击可运行的jar
    使用eclipse和maven一步一步配置web项目
    [转]hibernate三种状态详解
    [转]hibernate缓存机制所有详解
    Miniprofiler在普通net项目中的使用
    sql server 中更改默认实例
    使用awstats分析iis站点的日志
    NaN 和 Infinity
    反射的结果中排除隐藏的成员
  • 原文地址:https://www.cnblogs.com/cunyusup/p/15005672.html
Copyright © 2011-2022 走看看