美文网首页
lint0532. 逆序对

lint0532. 逆序对

作者: 日光降临 | 来源:发表于2019-03-03 21:35 被阅读0次
532. Reverse Pairs

For an array A, if i < j, and A [i] > A [j], called (A [i], A [j]) is a reverse pair.
return total of reverse pairs in A.

Example1
Input: A = [2, 4, 1, 3, 5]
Output: 3
Explanation:
(2, 1), (4, 1), (4, 3) are reverse pairs

Example2
Input: A = [1, 2, 3, 4]
Output: 0
Explanation:
No reverse pair

  • 利用归并排序的思想求逆序对,复杂度O(nlogn)当然也可以用树状数组或者线段树求解
public class Solution {
    public long reversePairs(int[] A) {
        return mergeSort(A, 0, A.length - 1);
    }
    
    private int mergeSort(int[] A, int start, int end) {
        if (start >= end) {
            return 0;
        }
        
        int mid = (start + end) / 2;
        int sum = 0;
        sum += mergeSort(A, start, mid);
        sum += mergeSort(A, mid+1, end);
        sum += merge(A, start, mid, end);
        return sum;
    }
    
    private int merge(int[] A, int start, int mid, int end) {
        int[] temp = new int[A.length];
        int leftIndex = start;
        int rightIndex = mid + 1;
        int index = start;
        int sum = 0;
        
        while (leftIndex <= mid && rightIndex <= end) {
            if (A[leftIndex] <= A[rightIndex]) {
                temp[index++] = A[leftIndex++];
            } else {
                temp[index++] = A[rightIndex++];
                sum += mid - leftIndex + 1;
            }
        }
        while (leftIndex <= mid) {
            temp[index++] = A[leftIndex++];
        }
        while (rightIndex <= end) {
            temp[index++] = A[rightIndex++];
        }
        
        for (int i = start; i <= end; i++) {
            A[i] = temp[i];
        }
        
        return sum;
    }
}

另一个写法:

//解法二
public class Solution {
    /**
     * @param A an array
     * @return total of reverse pairs
     */
    private static  int[] aux;
    int num = 0;
    public long reversePairs(int[] A) {
        // Write your code here
         aux = new int[A.length];
        sort(A,0,A.length-1);
        return num;
    }

    private void sort(int[] a, int lo, int hi) 
    {
        if (hi<=lo) return;

        int mid = lo + (hi - lo)/2;
        //递归
        sort(a, lo, mid);//左半边排序
        sort(a, mid+1, hi);//右半边排序
        merge(a,lo,mid,hi);//归并结果
    }

    //归并算法
    private void merge(int[] a, int lo, int mid, int hi){
        int i = lo;
        int j = mid + 1;

        for(int k = lo; k <= hi; k++){
            aux[k] = a[k];
        }
        //每次k,i或j都会右移一个
        for (int k = lo; k <= hi; k++){
            if (i>mid) a[k] = aux[j++];//如果左边归并完,则只添加右边
            else if (j>hi) {

                a[k] = aux[i++];//如果右边归并完,则只添加左边
            }
            //如果右边的小于左边的,则添加右边的
            else if (aux[j] < aux[i]) {
                a[k] = aux[j++];
                //右边的小于左边的当前数,则他小于当前至mid的所有数,因为数组在合并时已经为有序的了。
                num+=mid-i+1;
                }
            else a[k] = aux[i++];//如果左边的小于右边的,则添加左边的
        }
    }
}

https://www.jiuzhang.com/solution/reverse-pairs

相关文章

  • lint0532. 逆序对

    532. Reverse Pairs For an array A, if i < j, and A [i] > ...

  • 逆序对

    在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的...

  • 逆序对

    逆序对的定义 假定有一个序列,对于序列中任意两个元素和,如果有,则称和是一对逆序对。我们接下来以洛谷P1908 逆...

  • 求逆序对

    问题:对于一个包含N个非负整数的数组A[1..n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i...

  • 线代

    11/13 xd整理一下 行列式 1.逆序:时,两个数字组成一对逆序,只算一对。2.逆序数:为一个排列中的逆序对的...

  • 逆序单链表

    1、对一个单链表进行逆序操作。逆序之前为 head-->A-->B-->C-->None逆序之后为 head-->...

  • 逆序对 树状数组

    求逆序对除了有merge sort,还可以用树状数组比如输入数组为a,维护的树状数组为c,插入的时候,人为是c[a...

  • 532. 逆序对

    描述 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆...

  • 数组的逆序对

    思路:归并排序每次把数组从中间拆分成两部分,先统计拆分数组内部的逆序对,再把这个数组排序,防止统计重复,最后再把拆...

  • 532. 逆序对

    在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的...

网友评论

      本文标题:lint0532. 逆序对

      本文链接:https://www.haomeiwen.com/subject/nezmuqtx.html