|
73 | 73 | - 线段树的每个叶子节点代表一个长度为 1 的元区间 `[x, x]`;
|
74 | 74 | - 对于每个内部节点 `[l, r]`,它的左儿子是 `[l, mid]`,右儿子是 `[mid + 1, r]`, 其中 `mid = ⌊(l + r) / 2⌋` (即向下取整)。
|
75 | 75 |
|
| 76 | +**方法三:归并排序** |
| 77 | + |
76 | 78 | <!-- tabs:start -->
|
77 | 79 |
|
78 | 80 | ### **Python3**
|
@@ -523,6 +525,67 @@ func countSmaller(nums []int) []int {
|
523 | 525 | }
|
524 | 526 | ```
|
525 | 527 |
|
| 528 | +归并排序: |
| 529 | + |
| 530 | +```go |
| 531 | +type Pair struct { |
| 532 | + val int |
| 533 | + index int |
| 534 | +} |
| 535 | + |
| 536 | +var ( |
| 537 | + tmp []Pair |
| 538 | + count []int |
| 539 | +) |
| 540 | + |
| 541 | +func countSmaller(nums []int) []int { |
| 542 | + tmp, count = make([]Pair, len(nums)), make([]int, len(nums)) |
| 543 | + array := make([]Pair, len(nums)) |
| 544 | + for i, v := range nums { |
| 545 | + array[i] = Pair{val: v, index: i} |
| 546 | + } |
| 547 | + sorted(array, 0, len(array)-1) |
| 548 | + return count |
| 549 | +} |
| 550 | + |
| 551 | +func sorted(arr []Pair, low, high int) { |
| 552 | + if low >= high { |
| 553 | + return |
| 554 | + } |
| 555 | + mid := low + (high-low)/2 |
| 556 | + sorted(arr, low, mid) |
| 557 | + sorted(arr, mid+1, high) |
| 558 | + merge(arr, low, mid, high) |
| 559 | +} |
| 560 | + |
| 561 | +func merge(arr []Pair, low, mid, high int) { |
| 562 | + left, right := low, mid+1 |
| 563 | + idx := low |
| 564 | + for left <= mid && right <= high { |
| 565 | + if arr[left].val <= arr[right].val { |
| 566 | + count[arr[left].index] += right - mid - 1 |
| 567 | + tmp[idx], left = arr[left], left+1 |
| 568 | + } else { |
| 569 | + tmp[idx], right = arr[right], right+1 |
| 570 | + } |
| 571 | + idx++ |
| 572 | + } |
| 573 | + for left <= mid { |
| 574 | + count[arr[left].index] += right - mid - 1 |
| 575 | + tmp[idx] = arr[left] |
| 576 | + idx, left = idx+1, left+1 |
| 577 | + } |
| 578 | + for right <= high { |
| 579 | + tmp[idx] = arr[right] |
| 580 | + idx, right = idx+1, right+1 |
| 581 | + } |
| 582 | + // 排序 |
| 583 | + for i := low; i <= high; i++ { |
| 584 | + arr[i] = tmp[i] |
| 585 | + } |
| 586 | +} |
| 587 | +``` |
| 588 | + |
526 | 589 | ### **...**
|
527 | 590 |
|
528 | 591 | ```
|
|
0 commit comments