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;
}
相关推荐
酷飞飞44 分钟前
C语言的复合类型、内存管理、综合案例
java·c语言·前端
海上Bruce2 小时前
C primer plus (第六版)第十章 编程练习第7,8,9,10,11题
c语言
仟濹2 小时前
【C/C++】整数超过多少位时用「高精度」
c语言·c++·算法
夏影孤灯2 小时前
C 语言问题
c语言·开发语言
杰克尼6 小时前
11. 盛最多水的容器
算法·leetcode·职场和发展
程序员编程指南8 小时前
Qt 嵌入式界面优化技术
c语言·开发语言·c++·qt
云泽8089 小时前
数据结构前篇 - 深入解析数据结构之复杂度
c语言·开发语言·数据结构
技术思考者9 小时前
Leetcode - 反转字符串
数据结构·算法·leetcode
程序员编程指南9 小时前
Qt 开发 IDE 插件开发指南
c语言·c++·ide·qt·elasticsearch
laocooon52385788610 小时前
C语言画表格
c语言·开发语言