六数组中的逆序对

Posted 思想累积

tags:

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

题目:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例:

输入: [7,5,6,4]
输出: 5

限制:

0 <= 数组长度 <= 50000

代码实现:

方法一:
暴力解法(没啥说的很简单,嗯,超时了。。)

class Solution 
    public static int reversePairs(int[] nums) 
        int  n = 0;
        for(int i = 0; i < nums.length - 1; i ++) 
            for(int j = i; j < nums.length; j ++)
                if(nums[i] > nums[j]) 
                    n++;
                
            
        
        return n;
    

方法二:
使用归并排序

class Solution 
    public static int reversePairs(int[] nums) 
        if (nums == null || nums.length < 2) 
            return 0;
        
        return mergeSort(nums, 0, nums.length - 1);
    

    public static int mergeSort(int[] nums, int left, int right) 
        if (left >= right)  // left 小于 right 才能继续下去
            return 0;
        
        int mid = (left + right) / 2; // 找到中间位置
        return mergeSort(nums, left, mid) // 向左递归
            + mergeSort(nums, mid + 1, right) // 向右递归
            + merge(nums, left, mid, right); // 合并
    

    public static int merge(int[] arr, int left, int mid, int right) 
        int i = left; // 左边指针
        int j = mid + 1; // 右边指针
        int k = 0; // 临时数组指针
        int n = 0; // 计数
        int[] temp = new int[right - left + 1]; // 临时数组
        while (i <= mid && j <= right)  // 循环条件左边指针小于中间,右边小于最右边指针
            if (arr[i] > arr[j])  // 如果arr[i] > arr[j]的话
                temp[k++] = arr[j++]; // arr[j]赋值到temp数组中
                n += mid -i + 1; // 数组是有序的,arr[i] 后面元素不超过 mid 位置的元素都比 arr[j] 大
             else 
                temp[k++] = arr[i++];
            
        
        while (i <= mid) 
            temp[k++] = arr[i++];
        
        while (j <= right) 
            temp[k++] = arr[j++];
        
        // 循环给原来的数组赋值
        // 例如 int[] arr = 7, 5, 6, 4; 经过三次 merge,5, 7 4, 6 4, 5, 6, 7
        for (int l = 0; l < temp.length; l ++) 
            arr[left + l] = temp [l];
        
        return n;
    

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

LeetCode-数组数组中的逆序对

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

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

35.数组中的逆序对

数组中的逆序对-剑指Offer

剑指offer35:数组中的逆序对