首页 > 编程语言 > 详细

数组中的逆序对

时间:2020-09-12 10:57:59      阅读:63      评论:0      收藏:0      [点我收藏+]

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

输入描述:题目保证输入的数组中没有的相同的数字

                  数据范围:

                                   对于%50的数据,size <= 10^4

                                   对于%75的数据,size <= 10^5

                                   对于%100的数据,size <= 2*10^5

示例:

输入:1,2,3,4,5,6,7,0

输出:7

分析:此题好难,理解不上去,后续再看。

 1 public class Solution {
 2     private int cnt;
 3     private void MergeSort(int[] array, int start, int end){
 4         if(start >= end) return;
 5         int mid = (start + end) / 2;
 6         MergeSort(array, start, mid);
 7         MergeSort(array, mid+1, end);
 8         MergeOne(array, start, mid, end);
 9     }
10     private void MergeOne(int[] array, int start, int mid, int end){
11         int[] temp = new int[end - start + 1];
12         int k = 0, i = start, j = mid + 1;
13         while(i <= mid && j <= end){
14             //如果前面的元素小于后面的不能构成逆序对
15             if(array[i] <= array[j])
16                 temp[k++] = array[i++];
17             else{
18                 //如果前面的元素大于后面的,那么在前面元素之后的元素都能和后面的元素构成逆序对
19                 temp[k++] = array[j++];
20                 cnt = (cnt + (mid-i+1)) % 1000000007;
21             }
22         }
23         while(i <= mid)
24             temp[k++] = array[i++];
25         while(j <= end)
26             temp[k++] = array[j++];
27         for(int l = 0; l < k; l++){
28             array[start+l] = temp[l];
29         }
30     }
31     public int InversePairs(int [] array) {
32         MergeSort(array, 0, array.length-1);
33         return cnt;
34     }
35 }

 

数组中的逆序对

原文:https://www.cnblogs.com/lf6688/p/13655774.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!