首页 > 代码库 > [剑指Offer] 35.数组中的逆序对

[剑指Offer] 35.数组中的逆序对

题目描述

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

【思路】看到这样的题目,最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是o(n2),根据题目给出的数据量,很明显超时。因此想到了用归并排序的思想。

 1 class Solution {
 2 public:
 3     void MergeCount(vector<int>& data, int begin, int mid, int end, int& count)
 4     {
 5         int i = begin, j = mid;
 6         int temp[end - begin],  k = 0;
 7         while(i < mid && j < end)
 8         {
 9             if(data[i] < data[j])
10             {
11                 temp[k++] = data[i++];
12             }
13             else
14             {
15                 count += mid - i;
16                 if(count > 1000000007) count %= 1000000007;
17                 temp[k++] = data[j++];
18             }
19         }
20         while(i < mid) temp[k++] = data[i++];
21         while(j < end) temp[k++] = data[j++];
22         for(int s = 0; s < end - begin; ++s) data[s + begin] = temp[s];
23     }
24     void MergeSort(vector<int>& data, int begin, int end, int& count)
25     {
26         if(begin + 1 == end) return;
27         int mid = (begin + end) / 2;
28         MergeSort(data, begin, mid,count);
29         MergeSort(data, mid, end, count);
30         MergeCount(data, begin, mid, end, count);
31     }
32     int InversePairs(vector<int> data)
33     {
34         int n = static_cast<int>(data.size());
35         if(n == 0 || n == 1) return 0;
36         int count = 0;
37         MergeSort(data,0, n, count);
38         return count;
39     }
40 };

 

[剑指Offer] 35.数组中的逆序对