数组中的逆序对

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007


public class Solution {
    private long sum;
    public int InversePairs(int [] array) {
        sum=0;
        int l=0;
        int r=array.length-1;
        divide(l,r,array);
        return (int)(sum%1000000007);
    }
    
    //归并排序
    private void divide(int l,int r,int[] array){
        if(l!=r){
            int mid=(l+r)>>1;
            divide(l,mid,array);
            divide(mid+1,r,array);
            merge(l,r,mid,array);
        }
    }
    
    private void merge(int l,int r,int mid,int[] array){
        int i=l;//左区间起点
        int j=mid+1;//右区间起点
        int[] temp=new int[r-l+1];
        int index=0;
        while(i<=mid && j<=r){
            if(array[i]>array[j]){
                temp[index++]=array[j++];
                sum+=mid-i+1;  //核心,用于逆序对计数
            }else{
                temp[index++]=array[i++];
            }
        }
        
        while(i<=mid){
            temp[index++]=array[i++];
        }
        while(j<=r){
            temp[index++]=array[j++];
        }
        index=0;
        for(int k=l;k<=r;k++){
            array[k]=temp[index++];
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数...
    就这些吗阅读 1,859评论 0 0
  • 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中...
    qming_c阅读 2,312评论 0 1
  • 剑指Offer(三十五):数组中的逆序对 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获...
    xiaoming3526阅读 936评论 0 0
  • 题目描述 [数组中的逆序对] 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入...
    一只可爱的柠檬树阅读 1,742评论 0 1
  • 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数...
    丶沧月阅读 3,564评论 0 0