码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-03-07 16:47:13      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:逆序   ast   title   class   void   sub   cas   元素   pre   

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数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.数组中的逆序对

标签:逆序   ast   title   class   void   sub   cas   元素   pre   

原文地址:http://www.cnblogs.com/lca1826/p/6514008.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!