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;
}
相关推荐
wangjialelele2 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
森G2 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
历程里程碑3 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
weixin_395448913 小时前
mult_yolov5_post_copy.c_cursor_0205
c语言·python·yolo
Z9fish3 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
晓13133 小时前
第六章 【C语言篇:结构体&位运算】 结构体、位运算全面解析
c语言·算法
iAkuya4 小时前
(leetcode)力扣100 61分割回文串(回溯,动归)
算法·leetcode·职场和发展
梵刹古音4 小时前
【C语言】 指针与数据结构操作
c语言·数据结构·算法
VT.馒头4 小时前
【力扣】2695. 包装数组
前端·javascript·算法·leetcode·职场和发展·typescript
刘琦沛在进步4 小时前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++