剑指offer—51.数组中的逆序对—分析及代码(Java)

剑指offer——51.数组中的逆序对——分析及代码[Java]

一、题目

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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

二、分析及代码

1. 归并排序

(1)思路

本题可结合归并排序的思路进行求解:每次归并过程中,(假设从小到大排序)较大的数字从前侧跨越较小的后侧数字进入新位置时,超过的较小数字个数就是逆序对的数目。
结合题目提示,本题结果可能量级较大,可通过每次累加后进行取模运算解决。

(2)代码

public class Solution {
    
    
    public int InversePairs(int [] array) {
    
    
        if (array == null || array.length == 0)
            return 0;
        return Sort(array, 0, array.length);
    }
    
    public int Sort(int[] array, int left, int right) {
    
    
        if (right - left < 2)
            return 0;
        
        int mid = (left + right) >> 1;
        int num = 0;
        num += Sort(array, left, mid);
        num += Sort(array, mid, right);
        
        int [] tempArray = new int[right - left];
        int l = left, r = mid;
        for (int i = left; i < right; i++) {
    
    
            if (r == right || (l < mid && array[l] < array[r])) {
    
    
                tempArray[i - left] = array[l++];
            } else {
    
    
                tempArray[i - left] = array[r++];
                num += mid - l;
                num %= 1000000007;
            }
        }
        
        for (int i = left; i < right; i++)
            array[i] = tempArray[i - left];
        return num;
    }
}

(3)结果

运行时间:464ms,占用内存:50408k。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/110410206
今日推荐