class Solution(object):
def reversePairs(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) <= 1:
return 0
temp = [x for x in nums]
return self.mergeSort(temp, nums, 0, len(nums) - 1)
def mergeSort(self, temp, nums, left, right):
if left >= right:
temp[left] = nums[left]
return 0
mid = (left + right) / 2
left_cnt = self.mergeSort(temp, nums, left, mid)
right_cnt = self.mergeSort(temp, nums, mid+1, right)
mid_cnt = 0
i = left
j = mid + 1
index = left
while i <= mid and j <= right:
if nums[i] <= nums[j]:
temp[index] = nums[i]
i += 1
else:
temp[index] = nums[j]
j += 1
mid_cnt += mid - i + 1
index += 1
while i <= mid:
temp[index] = nums[i]
i += 1
index += 1
while j <= right:
temp[index] = nums[j]
j += 1
index += 1
return left_cnt + mid_cnt + right_cnt
class Solution(object):
def reversePairs(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if not nums:
return 0
temp = [i for i in nums]
return self.mergeSort(temp, nums, 0, len(nums)-1)
def mergeSort(self, temp, data, low, high):
if low >= high:
temp[low] = data[low]
return 0
mid = (low + high) / 2
left = self.mergeSort(data, temp, low, mid)
right = self.mergeSort(data, temp, mid+1, high)
count = 0
i = low
j = mid+1
index = low
while i <= mid and j <= high:
if data[i] <= data[j]:
temp[index] = data[i]
i += 1
else:
temp[index] = data[j]
count += mid-i+1
j += 1
index += 1
while i <= mid:
temp[index] = data[i]
i += 1
index += 1
while j <= high:
temp[index] = data[j]
j += 1
index += 1
return count + left + right