数组中的逆序对

Posted captain-dl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组中的逆序对相关的知识,希望对你有一定的参考价值。

题目来源:
 https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

《剑指offer》

自我感觉难度/真实难度:

easy 

题意:
 
分析:
 
自己的代码:
代码效率/结果:
 
优秀代码:
//数组中的逆序对
    public static int InversePairs(int[] array){
        if(array==null||array.length<=1)
            return 0;
        int[] copy = new int[array.length];
        for(int i=0;i<array.length;i++){
            copy[i] = array[i];
        }
        return mergeCount(array, copy, 0, array.length-1);
    }
    
    public static int mergeCount(int[] array, int[] copy, int start, int end){
        if(start==end){
            copy[start] = array[start];
            return 0;
        }
        int mid = (start+end)>>1;
        int leftCount = mergeCount(copy, array, start, mid);
        int rightCount = mergeCount(copy, array, mid+1, end);
        
        int i = mid;//i初始化为前半段最后一个数字的下标
        int j = end;//j初始化为后半段最后一个数字的下标
        int index = end;//辅助数组复制的数组的最后一个数字的下标
        int count = 0;//计数--逆序对的数目
        while(i>=start&&j>=mid+1){
            if(array[i]>array[j]){
                copy[index--] = array[i--];
                count += j-mid;
            }else{
                copy[index--] = array[j--];
            }
        }
        for(;i>=start;i--){
            copy[index--] = array[i];
        }
        for(;j>=mid+1;j--){
            copy[index--] = array[j];
        }
        return leftCount+rightCount+count;
    }

 

代码效率/结果:
 
自己优化后的代码:
 
反思改进策略:

 1.不会用归并排序,没有想到怎么样最快速实现这个想法

2.暴利的循环解题肯定是没有好处的,要注意思考和现有的什么算法有异曲同工的地方

写题时间时长:

2h

以上是关于数组中的逆序对的主要内容,如果未能解决你的问题,请参考以下文章

六数组中的逆序对

Java 剑指offer(51)数组中的逆序对

经典算法——数组中的逆序对

35.数组中的逆序对

数组中的逆序对-剑指Offer

剑指offer35:数组中的逆序对