@@ -6,8 +6,69 @@ import (
6
6
"github.com/halfrost/LeetCode-Go/template"
7
7
)
8
8
9
- // 解法一 线段树 ,时间复杂度 O(n log n)
9
+ // 解法一 归并排序 mergesort ,时间复杂度 O(n log n)
10
10
func reversePairs (nums []int ) int {
11
+ buf := make ([]int , len (nums ))
12
+ return mergesortCount (nums , buf )
13
+ }
14
+
15
+ func mergesortCount (nums , buf []int ) int {
16
+ if len (nums ) <= 1 {
17
+ return 0
18
+ }
19
+ mid := (len (nums ) - 1 ) / 2
20
+ cnt := mergesortCount (nums [:mid + 1 ], buf )
21
+ cnt += mergesortCount (nums [mid + 1 :], buf )
22
+ for i , j := 0 , mid + 1 ; i < mid + 1 ; i ++ { // Note!!! j is increasing.
23
+ for ; j < len (nums ) && nums [i ] <= 2 * nums [j ]; j ++ {
24
+ }
25
+ cnt += len (nums ) - j
26
+ }
27
+ copy (buf , nums )
28
+ for i , j , k := 0 , mid + 1 , 0 ; k < len (nums ); {
29
+ if j >= len (nums ) || i < mid + 1 && buf [i ] > buf [j ] {
30
+ nums [k ] = buf [i ]
31
+ i ++
32
+ } else {
33
+ nums [k ] = buf [j ]
34
+ j ++
35
+ }
36
+ k ++
37
+ }
38
+ return cnt
39
+ }
40
+
41
+ // 解法二 树状数组,时间复杂度 O(n log n)
42
+ func reversePairs1 (nums []int ) (cnt int ) {
43
+ n := len (nums )
44
+ if n <= 1 {
45
+ return
46
+ }
47
+ // 离散化所有下面统计时会出现的元素
48
+ allNums := make ([]int , 0 , 2 * n )
49
+ for _ , v := range nums {
50
+ allNums = append (allNums , v , 2 * v )
51
+ }
52
+ sort .Ints (allNums )
53
+ k := 1
54
+ kth := map [int ]int {allNums [0 ]: k }
55
+ for i := 1 ; i < 2 * n ; i ++ {
56
+ if allNums [i ] != allNums [i - 1 ] {
57
+ k ++
58
+ kth [allNums [i ]] = k
59
+ }
60
+ }
61
+ bit := template.BinaryIndexedTree {}
62
+ bit .Init (k )
63
+ for i , v := range nums {
64
+ cnt += i - bit .Query (kth [2 * v ])
65
+ bit .Add (kth [v ], 1 )
66
+ }
67
+ return
68
+ }
69
+
70
+ // 解法三 线段树,时间复杂度 O(n log n)
71
+ func reversePairs2 (nums []int ) int {
11
72
if len (nums ) < 2 {
12
73
return 0
13
74
}
@@ -42,35 +103,3 @@ func reversePairs(nums []int) int {
42
103
}
43
104
return res
44
105
}
45
-
46
- // 解法二 mergesort
47
- func reversePairs1 (nums []int ) int {
48
- buf := make ([]int , len (nums ))
49
- return mergesortCount (nums , buf )
50
- }
51
-
52
- func mergesortCount (nums , buf []int ) int {
53
- if len (nums ) <= 1 {
54
- return 0
55
- }
56
- mid := (len (nums ) - 1 ) / 2
57
- cnt := mergesortCount (nums [:mid + 1 ], buf )
58
- cnt += mergesortCount (nums [mid + 1 :], buf )
59
- for i , j := 0 , mid + 1 ; i < mid + 1 ; i ++ { // Note!!! j is increasing.
60
- for ; j < len (nums ) && nums [i ] <= 2 * nums [j ]; j ++ {
61
- }
62
- cnt += len (nums ) - j
63
- }
64
- copy (buf , nums )
65
- for i , j , k := 0 , mid + 1 , 0 ; k < len (nums ); {
66
- if j >= len (nums ) || i < mid + 1 && buf [i ] > buf [j ] {
67
- nums [k ] = buf [i ]
68
- i ++
69
- } else {
70
- nums [k ] = buf [j ]
71
- j ++
72
- }
73
- k ++
74
- }
75
- return cnt
76
- }
0 commit comments