To prove safety Offer 51

 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

This question timeout, oj is said to be the judgment of the python problem.

 

The following is a reference of java implementation can be submitted to:

. 1  public  class Solution {
 2      Private  Long CNT = 0 ;
 . 3      Private  int [] tmp;   // declared here auxiliary array instead statement merge () recursive functions 
. 4  
. 5      public  int InversePairs ( int [] the nums) {
 . 6          = tmp new new  int [nums.length];
 . 7          mergesort (the nums, 0 , nums.length - . 1 );
 . 8          return ( int ) (% CNT 1,000,000,007 );
 . 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 }

 

Guess you like

Origin www.cnblogs.com/asenyang/p/11023306.html