| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | 
							- func reversePairs(nums []int) int {
 
- 	return mergeSort(nums, 0, len(nums)-1)
 
- }
 
- func mergeSort(nums []int, beg int, end int) int {
 
- 	if end <= beg {
 
- 		return 0
 
- 	}
 
- 	l, m := beg, beg+(end-beg)/2
 
- 	r, p, k := m+1, m+1, 0
 
- 	res := mergeSort(nums, beg, m) + mergeSort(nums, r, end)
 
- 	merge := make([]int, end-beg+1)
 
- 	for l <= m {
 
- 		for ; p <= end && 2*nums[p] < nums[l]; p++ {
 
- 		} // Advance l once each loop to calculate the cnt of reverse pairs
 
- 		res += p - m - 1
 
- 		for r <= end && nums[r] <= nums[l] {
 
- 			merge[k] = nums[r]
 
- 			k, r = k+1, r+1
 
- 		}
 
- 		merge[k] = nums[l]
 
- 		k, l = k+1, l+1
 
- 	}
 
- 	for r <= end {
 
- 		merge[k] = nums[r]
 
- 		k, r = k+1, r+1
 
- 	}
 
- 	copy(nums[beg:end+1], merge)
 
- 	return res
 
- }
 
- // ---------------------dividing line for TLE binary search algorithm---------------------
 
- type ints [][]int
 
- func (is ints) search(x int, beg int, end int) int {
 
- 	for beg <= end {
 
- 		mid := beg + (end-beg)/2
 
- 		if is[mid][0] < x {
 
- 			beg = mid + 1
 
- 		} else {
 
- 			end = mid - 1
 
- 		}
 
- 	}
 
- 	return beg
 
- }
 
- func (is *ints) insert(x int) int {
 
- 	beg, end := 0, len(*is)
 
- 	beg = is.search(2*x+1, beg, end-1)
 
- 	cnt := 0
 
- 	for i := beg; i < end; i++ {
 
- 		cnt += (*is)[i][1]
 
- 	}
 
- 	if beg == end {
 
- 		beg--
 
- 	}
 
- 	if x < 0 {
 
- 		beg = is.search(x, 0, end-1)
 
- 	} else {
 
- 		beg = is.search(x, 0, beg)
 
- 	}
 
- 	if beg == end {
 
- 		*is = append(*is, []int{x, 1})
 
- 	} else if (*is)[beg][0] == x {
 
- 		(*is)[beg][1]++
 
- 	} else {
 
- 		nis := make([][]int, end+1)
 
- 		copy(nis, (*is)[:beg])
 
- 		nis[beg] = []int{x, 1}
 
- 		copy(nis[beg+1:], (*is)[beg:])
 
- 		*is = nis
 
- 	}
 
- 	return cnt
 
- }
 
- func reversePairsTLE(nums []int) (cnt int) {
 
- 	var is ints = make([][]int, 0)
 
- 	for _, i := range nums {
 
- 		cnt += is.insert(i)
 
- 	}
 
- 	return
 
- }
 
 
  |