560. 和为 K 的子数组【哈希、前缀和】

这篇具有很好参考价值的文章主要介绍了560. 和为 K 的子数组【哈希、前缀和】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

560. 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。

示例 1:
输入:nums = [1,1,1], k = 2
输出:2

示例 2:
输入:nums = [1,2,3], k = 3
输出:2

提示:
1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107


C代码:哈希、前缀和

560. 和为 K 的子数组【哈希、前缀和】

只需要统计有多少个前缀和 == sum - k
移动的滑动窗口的问题转换为 不断变换的前缀和的问题
【模型想象】:滑动窗口的和不变,随着滑动窗口右端向右移动的同时,窗口为满足sum一定,左端会做出对应的响应;此时,就将 总前缀和 ([0, i]的和pre[i]) - k 的问题转换为 pre[j-1]前缀和 的问题;
(每次滑动窗口均不一致,就算是每次窗口使用的都是 相同的前缀和,此时的窗口也是不一致的。例如:1 2 3 0 0 k==3)

typedef struct hashNode {
    int prefixSum;
    int cnt;
    UT_hash_handle hh;
} HashNode;

int subarraySum(int* nums, int numsSize, int k)
{
    int cnt = 0;
    HashNode *hashSet = NULL;
    int prefixSum = 0;

    HashNode *head = (HashNode *)malloc(sizeof(HashNode));
    head->prefixSum = 0;
    head->cnt = 1;
    HASH_ADD_INT(hashSet, prefixSum, head);

    for (int i = 0; i < numsSize; i++) {
        prefixSum += nums[i];
        int value = prefixSum - k;
        HASH_FIND_INT(hashSet, &value, head);
        if (head != NULL) {
            cnt += head->cnt;
        }

        HASH_FIND_INT(hashSet, &prefixSum, head);
        if (head != NULL) {
            head->cnt++;
        } else {
            head = (HashNode *)malloc(sizeof(HashNode));
            head->prefixSum = prefixSum;
            head->cnt = 1;
            HASH_ADD_INT(hashSet, prefixSum, head);
        }
    }
    return cnt;
}

C代码:暴力、超过时间限制

int subarraySum(int* nums, int numsSize, int k){
    int cnt = 0;
    for (int i = 0; i < numsSize; ++i) {
        int sum = 0;                          // 包含负数、0
        for (int j = i; j < numsSize; ++j) {  // for遍历就包含了顺序:滑动窗口
            sum += nums[j];
            if (sum == k) {
                ++cnt;
            }
        }
    }
    return cnt;
}

C错误代码:滑动窗口没有考虑到负数和0文章来源地址https://www.toymoban.com/news/detail-434266.html

int subarraySum(int* nums, int numsSize, int k){
    int sum = 0;
    int cnt = 0;
    int l = 0;
    for (int i = 0; i < numsSize; ++i) {
        sum += nums[i];
        while(sum > k) {  // 没有考虑到负数和0
            sum -= nums[l];
            ++l;
        }
        if (sum == k) {
            ++cnt;
        }
    }
    return cnt;
}

到了这里,关于560. 和为 K 的子数组【哈希、前缀和】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前缀和】LeetCode 560. 和为k的字数组

    力扣560题,链接:https://leetcode.cn/problems/subarray-sum-equals-k 暴力法,三重for循环,时间复杂度 O ( N 3 ) O(N^3) O ( N 3 ) ,会超时。 思路:两个for循环遍历起始位置和终止位置,第三个for遍历求解这段区间的和是否为k。 代码略。 在暴力法中我们发现会在很多重复计算,比如求前1

    2024年02月16日
    浏览(41)
  • 算法:给你一个整数数组 nums 和一个整数k,请你统计并返回该数组中和为 k 的子数组的个数

    Java面试题目录 算法:给你一个整数数组 nums 和一个整数k,请你统计并返回该数组中和为 k 的子数组的个数 使用前缀和来实现。在保存累加和的数组preSum中,找坐标大的元素与坐标小的元素差值正好为k的个数。 leecode地址:. - 力扣(LeetCode) 直接在力扣找了个写好的答案。

    2024年01月24日
    浏览(50)
  • hot100:10和为k的子数组

    题目链接: LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 算法思想: 法一(暴力法): 使用两层for循环列举出所有的子数组,使用一个变量sum求得子数组的和并判断是否为k 法二(前缀和+哈希表): 前缀和:前缀和就是从下标为0的元素开始到当

    2024年01月23日
    浏览(45)
  • 【LeetCode热题100】【子串】和为 K 的子数组

    题目 给你一个整数数组  nums  和一个整数  k  ,请你统计并返回  该数组中和为  k   的子数组的个数  。 子数组是数组中元素的连续非空序列。 示例 1: 示例 2: 提示: 1 = nums.length = 2 * 104 -1000 = nums[i] = 1000 -107 = k = 107 暴力  直接两层循环找出所有连续子数组的和,这个

    2024年01月19日
    浏览(44)
  • 剑指 Offer II 010. 和为 k 的子数组

    给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。 示例 1: 示例 2: 提示: 这个题目做出来不难,直接暴力枚举。但是利用哈希表和前缀和优化的过程我一直不是很理解,所以写下这篇文章来一点一点的研究,希望能对大家有所帮助 首先,先看最

    2023年04月16日
    浏览(42)
  • Leetcode-每日一题【剑指 Offer II 010. 和为 k 的子数组】

    给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。 示例 1: 输入: nums = [1,1,1], k = 2 输出: 2 解释: 此题 [1,1] 与 [1,1] 为两种不同的情况 示例 2: 输入: nums = [1,2,3], k = 3 输出: 2 提示: 1 = nums.length = 2 * 104 1000 = nums[i] = 1000 107 = k = 107 前置知识 前缀和

    2024年02月15日
    浏览(48)
  • LeetCode算法心得——和可被 K 整除的子数组(前缀和+HashMap)

    大家好,我是晴天学长,同余定理的应用,需要的小伙伴可以关注支持一下哦!后续会继续更新的。 1) .和可被 K 整除的子数组 题目描述 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释:

    2024年02月07日
    浏览(41)
  • 每日一题411数组中两个数的最大异或值(哈希表、前缀树:实现前缀树)

    LeetCode题目:https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/   本题使用哈希表方法主要运用到一个定理:异或满足算法交换律。即如果a^b = c,那么必然 b ^ c = a。且数组中的元素都在 [ 0 , 2 31 ) [0,2^{31}) [ 0 , 2 31 ) ,因此可以确定数值的最高位是30位。   因此,可以假设

    2024年02月05日
    浏览(42)
  • leetcode分类刷题:哈希表(Hash Table)(四、前缀和 处理连续子数组)

    1、leetcode题目里对于 元素加和 的考察可谓是屡见不鲜,包括 简单的限定一个有效答案 的两个或多个元素求和leetcode分类刷题:哈希表(Hash Table)(一、简单的两数之和)、在有序数组内对加和等于target的 三元组、四元组 等的求解leetcode分类刷题:基于数组的双指针(三、

    2024年02月10日
    浏览(39)
  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。(哈希法)

    思路: 当题意中需要判断某个元素是否出现过,或者某个元素是否在这个集合里出现过。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包