C语言 | Leetcode C语言题解之第446题等差数列划分II-子序列

题目:

题解:

#define HASH_FIND_LONG(head, findint, out) HASH_FIND(hh, head, findint, sizeof(long), out)
#define HASH_ADD_LONG(head, intfield, add) HASH_ADD(hh, head, intfield, sizeof(long), add)

struct HashTable {
    long key;
    int val;
    UT_hash_handle hh;
};

int query(struct HashTable** HashTable, long ikey) {
    struct HashTable* tmp;
    HASH_FIND_LONG(*HashTable, &ikey, tmp);
    return tmp == NULL ? 0 : tmp->val;
}

void add(struct HashTable** HashTable, long ikey, int ival) {
    struct HashTable* tmp;
    HASH_FIND_LONG(*HashTable, &ikey, tmp);
    if (tmp == NULL) {
        tmp = malloc(sizeof(struct HashTable));
        tmp->key = ikey, tmp->val = ival;
        HASH_ADD_LONG(*HashTable, key, tmp);
    } else {
        tmp->val += ival;
    }
}

int numberOfArithmeticSlices(int* nums, int numsSize) {
    int ans = 0;
    struct HashTable* hashTable[numsSize];
    memset(hashTable, 0, sizeof(hashTable));
    for (int i = 0; i < numsSize; ++i) {
        for (int j = 0; j < i; ++j) {
            long long d = 1LL * nums[i] - nums[j];
            int cnt = query(&hashTable[j], d);
            ans += cnt;
            add(&hashTable[i], d, cnt + 1);
        }
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值