zoukankan      html  css  js  c++  java
  • 剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)

    题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对。输入一个数组求出数组中逆序对的总数。

    以空间换时间:
    思路:借助一个辅助数组,将原来的数组复制到该数组中。然后将该数组分成子数组,然后统计子数组中内部的逆序,然后再统计两个相连的子数组中的逆序对,这个过程用到了归并排序。时间复杂度为O(nlogn)。

    如下图所示:

    Java代码:

    public class ReversePairs {
       public int  reversePairs(int[] a){
           if(a==null)
               return 0;
           int[] b=new int[a.length];
           System.arraycopy(a, 0, b, 0, a.length);
          
           int count=reversePairsCore(a,b,0,a.length-1);
           
           return count;
       }
    
       public int reversePairsCore(int[] a, int[] b, int start, int end) {
        if(a==null||b==null)
            return 0;
        if(start==end){
            b[start]=a[start];
            return 0;
        }
        int len=(end-start)/2;
        int left=reversePairsCore(b,a,start,start+len);
        int right=reversePairsCore(b,a,start+len+1,end);
        //初始化前半段的最后一个数字的下标
        int i=start+len;
        //初始化后半段的最后一个数字的下标
        int j=end;
        //初始化复制数组的最后一个数字的下标
        int copyIndex=end;
        int count=0;
        while(i>=start&&j>=start+len+1){
            if(a[i]>a[j]){
                b[copyIndex--]=a[i--];
                count+=j-start-len;
            }
            else
                b[copyIndex--]=b[j--];
        }
        for(;i>=start;i--){
            b[copyIndex--]=a[i];
        }
        for(;j>=start+len+1;j--)
            b[copyIndex--]=a[j];
        return left+right+count;
    }
       public static void main(String[] args){
           int[] a={7,5,6,4};
           ReversePairs rp=new ReversePairs();
           int count=rp.reversePairs(a);
           System.out.println(count+" ");
       }
    }
  • 相关阅读:
    【HNOI 2002】 营业额统计
    【BZOJ 3224】 普通平衡树
    【NOIP2014】 联合权值
    【NOIP2016】 组合数问题
    BZOJ2212 POI2011Tree Rotations(线段树合并)
    LOJ114 k大(xiao)异或和(线性基)
    LOJ121 动态图连通性(LCT)
    BZOJ3569 DZY Loves Chinese II(随机化+树上差分+线性基)
    BZOJ3237 AHOI2013连通图(线段树分治+并查集)
    BZOJ2208 JSOI2010连通数(floyd+bitset)
  • 原文地址:https://www.cnblogs.com/hupp/p/4763114.html
Copyright © 2011-2022 走看看