自学内容网 自学内容网

C语言 | Leetcode C语言题解之第560题和为K的子数组

题目:

题解:

// 暴力美学:20行C代码
int subarraySum(int *nums, int numsSize, int k) {
    int count = 0;
    // 弄个大数组做个暴力的Hash表,大概4*20M*2=160M。用calloc初始化为全零。
    int *maps = (int *)calloc(1001 * 20001 * 2, sizeof(int));
    // 前缀和可能是负数,把指针放到中间位置
    int *map = maps + 1001 * 20001 * 1;
    // 补一个最前面的前缀和,用了下标0
    int sum = 0;
    map[sum]++;
    // 下标从1开始,注意=
    for (int i = 1; i <= numsSize; i++) {
        // 注意-1
        sum += nums[i - 1];
        if (map[sum - k] > 0) {
            count += map[sum - k];
        }
        map[sum]++;
    }
    free(maps);
    return count;
}

原文地址:https://blog.csdn.net/m0_59237910/article/details/143699508

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!