dengxinyi 6 年之前
父節點
當前提交
7f6179efab
共有 1 個文件被更改,包括 81 次插入1 次删除
  1. 81 1
      hard/493.reverse-pairs.go

+ 81 - 1
hard/493.reverse-pairs.go

@@ -1,3 +1,83 @@
 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
 }