C语言 | Leetcode C语言题解之第220题存在重复元素III

题目:

题解:

cpp 复制代码
struct HashTable {
    int key;
    int val;
    UT_hash_handle hh;
};

int getID(int x, long long w) {
    return x < 0 ? (x + 1ll) / w - 1 : x / w;
}

struct HashTable* query(struct HashTable* hashTable, int x) {
    struct HashTable* tmp;
    HASH_FIND_INT(hashTable, &x, tmp);
    return tmp;
}

bool containsNearbyAlmostDuplicate(int* nums, int numsSize, int k, int t) {
    struct HashTable* hashTable = NULL;
    for (int i = 0; i < numsSize; i++) {
        long long x = nums[i];
        int id = getID(x, t + 1ll);
        struct HashTable* tmp;
        tmp = query(hashTable, id - 1);
        if (tmp != NULL && fabs(x - tmp->val) <= t) {
            return true;
        }
        tmp = query(hashTable, id + 1);
        if (tmp != NULL && fabs(x - tmp->val) <= t) {
            return true;
        }
        tmp = query(hashTable, id);
        if (tmp != NULL) {
            return true;
        } else {
            tmp = malloc(sizeof(struct HashTable));
            tmp->key = id;
            tmp->val = x;
            HASH_ADD_INT(hashTable, key, tmp);
        }
        if (i >= k) {
            tmp = query(hashTable, getID(nums[i - k], t + 1ll));
            HASH_DEL(hashTable, tmp);
        }
    }
    return false;
}
相关推荐
洛水水9 分钟前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
石一峰69925 分钟前
C 语言函数设计模式实战经验
c语言·开发语言·设计模式
洛水水1 小时前
【力扣100题】85.每日温度
算法·leetcode·职场和发展
Kurisu_红莉栖1 小时前
力扣56合并区间
算法·leetcode
开源Z1 小时前
LeetCode 135 · 分发糖果:两次扫描,先左后右取最大
算法·leetcode
坚果派·白晓明1 小时前
鸿蒙 PC 应用集成 libhv 鸿蒙化三方库 —— AtomCode + Skills 驱动的高效集成实践
c语言·c++·ai编程·harmonyos·atomcode
退休倒计时1 小时前
【每日一题】LeetCode 19. 删除链表的倒数第 N 个结点 TypeScript
leetcode·链表·typescript
aaaameliaaa2 小时前
C语言随机数函数使用全解析
c语言·笔记
玖玥拾3 小时前
C/C++ 数据结构(二)双向链表
c语言·数据结构·c++
dnbug Blog3 小时前
C 程序基本结构
c语言·程序结构