Golang | Leetcode Golang题解之第493题翻转对

题目:

题解:

Go 复制代码
type fenwick struct {
    tree []int
}

func newFenwickTree(n int) fenwick {
    return fenwick{make([]int, n+1)}
}

func (f fenwick) add(i int) {
    for ; i < len(f.tree); i += i & -i {
        f.tree[i]++
    }
}

func (f fenwick) sum(i int) (res int) {
    for ; i > 0; i &= i - 1 {
        res += f.tree[i]
    }
    return
}

func reversePairs(nums []int) (cnt int) {
    n := len(nums)
    if n <= 1 {
        return
    }

    // 离散化所有下面统计时会出现的元素
    allNums := make([]int, 0, 2*n)
    for _, v := range nums {
        allNums = append(allNums, v, 2*v)
    }
    sort.Ints(allNums)
    k := 1
    kth := map[int]int{allNums[0]: k}
    for i := 1; i < 2*n; i++ {
        if allNums[i] != allNums[i-1] {
            k++
            kth[allNums[i]] = k
        }
    }

    t := newFenwickTree(k)
    for i, v := range nums {
        // 统计之前插入了多少个比 2*v 大的数
        cnt += i - t.sum(kth[2*v])
        t.add(kth[v])
    }
    return
}
相关推荐
暖阳华笺20 分钟前
【数据结构与算法】哈希专题
数据结构·c++·算法·leetcode·哈希算法
AKA__Zas32 分钟前
芝士算法(滑动窗口片 2.0)
java·算法·leetcode·学习方法
四代水门44 分钟前
LeetCode刷算法题(C++)
c++·算法·leetcode
退休倒计时12 小时前
【每日一题】LeetCode 53. 最大子数组和 TypeScript
数据结构·算法·leetcode·typescript
张忠琳14 小时前
【Go 1.26.4】Golang Channel 深度解析
开发语言·后端·golang
洛水水15 小时前
【力扣100题】86.柱状图中最大的矩形
算法·leetcode·职场和发展
洛水水16 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
张忠琳16 小时前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
洛水水17 小时前
【力扣100题】85.每日温度
算法·leetcode·职场和发展
Kurisu_红莉栖17 小时前
力扣56合并区间
算法·leetcode