2021-11-04:计算右侧小于当前元素的个数。给你`一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。力扣315。

福大大 答案2021-11-04:

具体见代码。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    arr := []int{5, 2, 6, 1}
    ret := countSmaller(arr)
    fmt.Println(ret)
}

type Node struct {
    value int
    index int
}

func NewNode(v, i int) *Node {
    res := &Node{}
    res.value = v
    res.index = i
    return res
}

func countSmaller(nums []int) []int {
    ans := make([]int, 0)
    if len(nums) == 0 {
        return ans
    }
    for i := 0; i < len(nums); i++ {
        ans = append(ans, 0)
    }
    if len(nums) < 2 {
        return ans
    }
    arr := make([]*Node, len(nums))
    for i := 0; i < len(arr); i++ {
        arr[i] = NewNode(nums[i], i)
    }
    process(arr, 0, len(arr)-1, ans)
    return ans
}

func process(arr []*Node, l int, r int, ans []int) {
    if l == r {
        return
    }
    mid := l + ((r - l) >> 1)
    process(arr, l, mid, ans)
    process(arr, mid+1, r, ans)
    merge(arr, l, mid, r, ans)
}

func merge(arr []*Node, l int, m int, r int, ans []int) {
    help := make([]*Node, r-l+1)
    i := len(help) - 1
    p1 := m
    p2 := r
    for p1 >= l && p2 >= m+1 {
        if arr[p1].value > arr[p2].value {
            ans[arr[p1].index] = ans[arr[p1].index] + p2 - m
        }
        if arr[p1].value > arr[p2].value {
            help[i] = arr[p1]
            i--
            p1--
        } else {
            help[i] = arr[p2]
            i--
            p2--
        }
    }
    for p1 >= l {
        help[i] = arr[p1]
        p1--
        i--
    }
    for p2 >= m+1 {
        help[i] = arr[p2]
        p2--
        i--
    }
    for i := 0; i < len(help); i++ {
        arr[l+i] = help[i]
    }
}

执行结果如下: 图片


左神java代码