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;
}
相关推荐
xiaobobo333015 分钟前
C语言中宏定义宏名和宏值之间的关系
c语言·宏定义·语义型
闪电悠米3 小时前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵
a4493153624 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
a4493153625 小时前
iPhone 充电故障的全链路诊断——从 Lightning/USB-C 接口到 Tristar 充电 IC
c语言·macos·ios·电脑·硬件架构·iphone
qq_448011165 小时前
C语言中的getchar()
c语言·开发语言
天空'之城5 小时前
C 语言工业级通用组件手写 15:累加和校验
c语言·嵌入式开发·工业级组件·累加和校验
过期动态6 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
Adios79415 小时前
设置交集大小至少为2
数据结构·算法·leetcode
碎光拾影20 小时前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
GeekArch20 小时前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug