码迷,mamicode.com
首页 > 编程语言 > 详细

数组中的逆序对

时间:2019-03-18 22:31:48      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:nbsp   turn   count   剑指offer   for   时长   数字   循环   反思   

题目来源:
 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

数组中的逆序对

标签:nbsp   turn   count   剑指offer   for   时长   数字   循环   反思   

原文地址:https://www.cnblogs.com/captain-dl/p/10555556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!