数组中的逆序对

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

 1 # -*- coding:utf-8 -*-
 2 class Solution:
 3     def __init__(self):
 4         self.cnt = 0
 5         self.tmp = []
 6         
 7     def InversePairs(self, data):
 8         n = len(data)
 9         self.tmp =[0] * n
10         self.mergeSort(data,0,n-1)
11         return self.cnt % 1000000007
12         
13     def mergeSort(self,nums,l,h):
14         if h - l < 1:
15             return
16         m = l + (h - l) // 2
17         self.mergeSort(nums,l,m)
18         self.mergeSort(nums,m+1,h)
19         self.merge(nums,l,m,h)
20         
21     def merge(self,nums,l,m,h):
22         i,j,k = l,m+1,l
23         while i <= m or j <= h:
24             if i > m:
25                 self.tmp[k] = nums[j]
26                 j += 1
27             elif j > h:
28                 self.tmp[k] = nums[i]
29                 i += 1
30             elif nums[i] <= nums[j]:
31                 self.tmp[k] = nums[i]
32                 i += 1
33             else:
34                 self.tmp[k] = nums[j]
35                 j += 1
36                 self.cnt += m - i + 1
37             k += 1
38         k = l
39         while k <= h:
40             nums[k] = self.tmp[k]
41             k += 1
42         # write code here

本题超时,据说是oj对python的判断有问题。

 

下面是参考的java实现可以提交:

 1 public class Solution {
 2     private long cnt = 0;
 3     private int[] tmp;  // 在这里声明辅助数组,而不是在 merge() 递归函数中声明
 4 
 5     public int InversePairs(int[] nums) {
 6         tmp = new int[nums.length];
 7         mergeSort(nums, 0, nums.length - 1);
 8         return (int) (cnt % 1000000007);
 9     }
10 
11     private void mergeSort(int[] nums, int l, int h) {
12         if (h - l < 1)
13             return;
14         int m = l + (h - l) / 2;
15         mergeSort(nums, l, m);
16         mergeSort(nums, m + 1, h);
17         merge(nums, l, m, h);
18     }
19 
20     private void merge(int[] nums, int l, int m, int h) {
21         int i = l, j = m + 1, k = l;
22         while (i <= m || j <= h) {
23             if (i > m)
24                 tmp[k] = nums[j++];
25             else if (j > h)
26                 tmp[k] = nums[i++];
27             else if (nums[i] <= nums[j])
28                 tmp[k] = nums[i++];
29             else {
30                 tmp[k] = nums[j++];
31                 this.cnt += m - i + 1;  // nums[i] > nums[j],说明 nums[i...mid] 都大于 nums[j]
32         }
33         k++;
34     }
35     for (k = l; k <= h; k++)
36         nums[k] = tmp[k];
37     }
38 }

 

posted on 2019-06-14 15:02  Sempron2800+  阅读(194)  评论(0编辑  收藏  举报