C语言 | Leetcode C语言题解之第493题翻转对

题目:

题解:

cpp 复制代码
int lowbit(int x) {
    return x & (-x);
}

void update(int* tree, int treeSize, int x, int d) {
    while (x <= treeSize) {
        tree[x] += d;
        x += lowbit(x);
    }
}

int query(int* tree, int x) {
    int ans = 0;
    while (x) {
        ans += tree[x];
        x -= lowbit(x);
    }
    return ans;
}

int cmp(void* _a, void* _b) {
    long long a = *((long long*)_a), b = *((long long*)_b);
    return a < b ? -1 : 1;
}

int lower_bound(long long* a, int aSize, long long target) {
    int left = 0, right = aSize;
    while (left < right) {
        int mid = (left + right) / 2;
        if (a[mid] < target) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    return left;
}

int discrete(int* nums, int numsSize, int* ret) {
    long long rec[numsSize * 2];
    for (int i = 0; i < numsSize; i++) {
        rec[i * 2] = nums[i], rec[i * 2 + 1] = (long long)nums[i] * 2;
    }
    qsort(rec, numsSize * 2, sizeof(long long), cmp);
    int retSize = 0;
    for (int i = 0; i < numsSize * 2; i++) {
        if (retSize == 0 || rec[retSize - 1] != rec[i]) {
            rec[retSize++] = rec[i];
        }
    }
    for (int i = 0; i < numsSize; i++) {
        ret[i * 2] = lower_bound(rec, retSize, nums[i]) + 1;
        ret[i * 2 + 1] = lower_bound(rec, retSize, (long long)nums[i] * 2) + 1;
    }
    return retSize;
}

int reversePairs(int* nums, int numsSize) {
    if (numsSize == 0) {
        return 0;
    }

    int values[numsSize * 2];
    int valuesSize = discrete(nums, numsSize, values);
    int ret = 0;
    int tree[valuesSize + 2];
    memset(tree, 0, sizeof(tree));
    for (int i = 0; i < numsSize; i++) {
        int left = values[i * 2 + 1], right = valuesSize + 1;
        ret += query(tree, right) - query(tree, left);
        update(tree, valuesSize + 1, values[i * 2], 1);
    }
    return ret;
}
相关推荐
彷徨而立1 天前
【C/C++】不能在派生类的构造函数初始化列表中直接初始化属于基类的成员变量
c语言·c++
@宁兰1 天前
算法实现总结 - C/C++
c语言·c++·算法
cs麦子1 天前
C语言--详解--指针--下
c语言·数据结构·算法
aitoolhub1 天前
考研论文引用格式 AI 校验实操:工具合集 + 技术原理
c语言·人工智能·考研·aigc
flashlight_hi1 天前
LeetCode 分类刷题:3217. 从链表中移除在数组中存在的节点
javascript·数据结构·leetcode·链表
Tisfy1 天前
LeetCode 2536.子矩阵元素加 1:二维差分数组
算法·leetcode·矩阵
小欣加油1 天前
leetcode 2536 子矩阵元素加1
数据结构·c++·算法·leetcode·矩阵
小龙报1 天前
《VScode搭建教程(附安装包)--- 开启你的编程之旅》
c语言·c++·ide·vscode·单片机·物联网·编辑器
努力学算法的蒟蒻1 天前
day14(11.14)——leetcode面试经典150
算法·leetcode
序属秋秋秋1 天前
《Linux系统编程之进程基础》【进程入门】
linux·运维·c语言·c++·进程·系统编程·fork