zoukankan      html  css  js  c++  java
  • 35.数组中的逆序对

    题目描述:

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

    思路分析:

      这道题的解法十分巧妙,我们熟悉的数组排序中的归并排序,它在排序的过程中就是比较两个数的大小,如果是逆序它就交换,所以我们想求一个数组中的逆序对,就对他进行归并排序,在排序的过程中记录逆序对数。

    代码:

    public class Solution {
        int res;
        public int InversePairs(int [] array) {
            if(array==null||array.length==0)
                return 0;
            sort(array,0,array.length-1);
            return res%1000000007;
        }
        public void sort(int[]array,int start,int end){  //归并排序
            int mid=(start+end)/2;
            if(start<end){
                sort(array,start,mid);
                sort(array,mid+1,end);
                merge(array,start,mid,end);
            }
                
        }
        public void merge(int []array,int start,int mid,int end){
            int []temp=new int[end-start+1];
            int left=start;
            int right=mid+1;
            int k=0;
            while(left<=mid&&right<=end){
                if(array[left]<=array[right]){
                    temp[k++]=array[left++];
                }else{
                    temp[k++]=array[right++];
                    res=res+(mid-left+1);
                    res=res%1000000007;
                }
            }
            while(left<=mid){
                temp[k++]=array[left++];
            }
            while(right<=end){
                temp[k++]=array[right++];
            }
            for(int i=0;i<k;i++){
                array[start+i]=temp[i];
            }
        }
    }
    
  • 相关阅读:
    中断 异常 系统调用的比较
    线性结构-线性表
    数据结构引例
    友链
    投喂
    给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列
    C++类内存分布
    内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
    C++内存管理学习笔记(7)
    C++内存管理学习笔记(6)
  • 原文地址:https://www.cnblogs.com/yjxyy/p/10841038.html
Copyright © 2011-2022 走看看