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

     

    题目描述

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

    输入描述:

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

    示例1

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

    输出

    7

    思路:
    类似于megersort

    先统计子数组内部的逆序对的数目,然后再统计2个相邻子数组之间的逆序对的数目,在统计的过程中,还需要对数组排序,
    排序可以避免重复统计。

     1 public class Solution {
     2     public int InversePairs(int [] a) {  
     3         int[] aux = new int[a.length];
     4         for(int i = 0;i<a.length;i++)
     5             aux[i] = a[i];
     6         
     7         return fun(a,aux,0,a.length-1);
     8     }
     9     private int fun(int[] a,int[] aux,int lo,int hi){
    10         if(lo==hi) return 0;
    11         int mid = (hi-lo)/2+lo;
    12         int left = fun(a,aux,lo,mid)%1000000007;
    13         int right = fun(a,aux,mid+1,hi)%1000000007;
    14         
    15         int i = mid;
    16         int j = hi;
    17         int ai = hi;//aux_index
    18         int  count = 0;
    19         while(i>=lo&&j>=mid+1){
    20             if(a[i]>a[j]){
    21                 aux[ai--] = a[i--];
    22                 count+=j-mid;
    23                 if(count>=1000000007)//数值过大求余
    24                     count%=1000000007;       
    25             }
    26             else
    27                 aux[ai--]=a[j--];
    28         }
    29         
    30         while(i>=lo)
    31             aux[ai--]=a[i--];
    32         while(j>=mid+1)
    33             aux[ai--] =a[j--];    
    34         
    35         //更新数组
    36         for(int k = lo;k<=hi;k++)
    37             a[k] = aux[k];
    38         
    39         return (left+right+count)%1000000007;
    40     }
    41 }

    c++ 20180725

     1 class Solution {
     2 public:
     3     int InversePairs(vector<int> data) {
     4         int length = data.size();
     5         if(length<=0) return 0;
     6         std::vector<int> copy(data);
     7         long long cnt = InversePairsCore(data,copy,0,length-1);
     8         return cnt;
     9     }
    10     long long InversePairsCore(std::vector<int> &data,std::vector<int> &copy,int lo,int hi){
    11         if(lo==hi) return 0;
    12         int mid = lo+(hi-lo)/2;
    13         long long left = InversePairsCore(data,copy,lo,mid);
    14         long long right  =InversePairsCore(data,copy,mid+1,hi);
    15 
    16         int i = mid;
    17         int j = hi;
    18         int k = hi;
    19         int cnt = 0;
    20         while(i>=lo&&j>=mid+1){
    21             if(data[i]>data[j]){
    22                 copy[k--]=data[i--];
    23                 cnt+=j-mid;
    24                 if(cnt>=1000000007)
    25                 cnt%=1000000007;
    26             }
    27             else{
    28                 copy[k--]=data[j--];
    29             }
    30         }
    31         while(i>=lo)
    32             copy[k--] = data[i--];
    33         while(j>=mid+1)
    34             copy[k--] = data[j--];
    35         for(int m = lo;m<=hi;m++)
    36             data[m]  =copy[m];
    37         return (left+right+cnt)%1000000007;
    38     }
    39 };
  • 相关阅读:
    [PHP] 小数转科学计数法, 小数保留 n 位
    [Blockchain] Cosmos Starport 101
    [Blockchain] Cosmos Starport 地址前缀的变更方式
    [Blockchain] Cosmos Starport 安装的三种方式
    [ML] 机器学习的 7 步走
    [FAQ] MEMORY ALLOC FAILED: mmap with HUGETLB failed, attempting without it (you should fix your kernel)
    [FAQ] FastAdmin epay 微信公众号支付 JSAPI 支付必须传 openid ?
    [TP5] 动态绑定指定默认模块, 解决: 控制器不存在:appindexcontrollerApi
    [TP5] ThinkPHP 默认模块和单模块的设置方式
    [TP5] 浅谈 ThinkPHP 的 Hook 行为事件及监听执行
  • 原文地址:https://www.cnblogs.com/zle1992/p/8168153.html
Copyright © 2011-2022 走看看