首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分析Leetcode问题"974.可被K整除的子和“的时间复杂度

分析Leetcode问题"974.可被K整除的子和"的时间复杂度需要先了解题目的背景和要求。根据题目描述,给定一个整数数组A,求解满足以下条件的子数组个数:子数组元素和可以被K整除。要求计算并返回满足条件的子数组个数。

首先,我们可以尝试使用暴力解法来解决这个问题。我们可以通过两个指针i和j来确定一个子数组,然后计算该子数组的元素和是否可以被K整除。通过遍历所有可能的子数组,我们可以得到满足条件的子数组个数。该解法的时间复杂度为O(n^3),其中n为数组A的长度。

然而,上述暴力解法的时间复杂度较高,我们可以通过优化算法来提高性能。具体来说,我们可以利用前缀和的概念来降低时间复杂度。

首先,我们可以计算出数组A的前缀和数组prefixSum,其中prefixSum[i]表示从数组A的第一个元素到第i个元素的和。然后,我们可以通过计算prefixSum[i]和prefixSum[j]的差值,得到子数组A[i+1:j]的和。如果该差值可以被K整除,则说明该子数组的和可以被K整除。

为了方便计算差值是否可以被K整除,我们可以使用哈希表来保存每个前缀和对K的余数的出现次数。具体来说,我们可以遍历前缀和数组prefixSum,对于每个前缀和prefixSum[i],我们计算其对K的余数mod,然后将mod出现的次数记录在哈希表中。如果有一个前缀和prefixSum[j]的余数也为mod,并且满足条件(j>i),那么说明A[i+1:j]的和可以被K整除。我们可以通过统计每个余数出现的次数来计算满足条件的子数组个数。

上述解法的时间复杂度为O(n),其中n为数组A的长度。具体的步骤如下:

  1. 初始化一个哈希表count,用于记录每个余数的出现次数。同时,设置一个变量sum记录当前的前缀和,初始值为0。
  2. 初始化一个变量res,用于记录满足条件的子数组个数,初始值为0。
  3. 遍历数组A,对于每个元素num,执行以下操作:
    • 更新当前的前缀和sum:sum = (sum + num) % K。
    • 如果sum为负数,则将其加上K,以保证sum始终为非负数。
    • 如果哈希表count中已经存在键值为sum的项,则将其对应的值加1;否则,在哈希表count中新增一个键值为sum,值为1的项。
  • 遍历哈希表count,对于每个键值对(key, value),执行以下操作:
    • 如果value大于等于2,说明有至少两个前缀和对K的余数为key的元素,可以构成多个子数组满足条件。则根据组合数学的知识,我们可以计算出value个前缀和中任选2个的组合数,将结果累加到res中。
    • 如果value等于1,说明只有一个前缀和对K的余数为key的元素,不足以构成子数组满足条件。则不做任何操作。
  • 返回res,即为满足条件的子数组个数。

根据上述算法,我们可以得到该问题的时间复杂度为O(n),其中n为数组A的长度。在实际使用中,我们可以将该算法应用到云计算领域的大规模数据处理、分布式计算等场景中,通过合理利用云计算平台提供的各类服务和工具,提高数据处理的效率和性能。

参考腾讯云相关产品和产品介绍链接地址:

  • 云计算平台:https://cloud.tencent.com/product/cvm
  • 云存储服务:https://cloud.tencent.com/product/cos
  • 云数据库服务:https://cloud.tencent.com/product/cdb
  • 人工智能服务:https://cloud.tencent.com/product/ai
  • 服务器运维服务:https://cloud.tencent.com/product/ess
  • 网络安全服务:https://cloud.tencent.com/product/ddos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

LeetCode刷题DAY 25:可被 K 整除数组

难度:中等 关键词:同余定理、哈希表 ⭐️⭐️⭐️⭐️ 1 题目描述 给定一个整数数组A,返回其中元素之和可被 K 整除(连续、非空)数组数目。...如输入 A = [4,5,0,-2,-3,1], K = 5,返回7(因为有7个连续数组可被5整除)。...2 题解 思路:哈希表 本题跟LeetCode刷题DAY 17:k数组较为类似,定义pre(i)为[0,i]内所有元素,则有pre(i)=pre(i-1)+A[i]关系,要找有多少个(pre...(i)-pre(j-1))可被K整除。...在本题中,即有(pre(i)-pre(j-1))|K等同于pre(i)≡pre(j-1)(mod K),因此我们在本题中可以建立哈希表,已余数为键,已该余数出现次数为值,计算哈希表中与pre(i)|K取值一样键对应值即可

43520
  • LeetCode 1015. 可被 K 整除最小整数(数学)

    题目 给定正整数 K,你需要找出可以被 K 整除、仅包含数字 1 最小正整数 N。 返回 N 长度。如果不存在这样 N,就返回 -1。...示例 1: 输入:1 输出:1 解释:最小答案是 N = 1,其长度为 1。 示例 2: 输入:2 输出:-1 解释:不存在可被 2 整除正整数 N 。...示例 3: 输入:3 输出:3 解释:最小答案是 N = 111,其长度为 3。...提示: 1 <= K <= 10^5 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/smallest-integer-divisible-by-k...解题 25倍数显然不能被全是1整除,证明见官网题解 提前取余,避免溢出 (n*10+1)%K = ((n%K)*10+1)%K class Solution { public: int

    92020

    Leetcode 1010. 总持续时间可被 60 整除歌曲

    题目描述 在歌曲列表中,第 i 首歌曲持续时间为 time[i] 秒。 返回其总持续时间(以秒为单位)可被 60 整除歌曲对数量。...示例 1: 输入:[30,20,150,100,40] 输出:3 解释:这三对总持续时间可被 60 整数: (time[0] = 30, time[2] = 150): 总持续时间 180 (...因为每个数字都是正数,不妨数组中每位数字对 60 取余数,这样要求两个数字为 60 或 0 即可,而不再是 60 整数倍。...此时问题变为求和问题,可以以哈希表或者数组形式,存储每个元素值对应出现次数。 一次遍历即可获得最后总对数。...对于元素值为 0 30 情况,其对数个数为 l*(l-1)/2,根据对称性,只需遍历 1~29 情况即可。

    56200

    【刷题】前缀进阶

    适用于对数组有大量重复操作问题,一维预处理较简单,二维比较复杂,画图分析可以顺利解决! 2 Leetcode 560. K 数组 上链接:560....count++; } } return count; } 定睛一看,这这这好像时间复杂度还不如暴力算法啊,这个时间复杂度是O(n^2)...我们来分析一下 假如我们枚举到 第 i 个数字,得到了当前前缀 sum, 那么如果想要得到满足k 数组,就要寻找前缀为 sum - k数组 那么前缀为sum - k数组怎么得到呢?...3 Leetcode 974. 可被 K 整除数组 上链接:974. 可被 K 整除数组 题目描述 这个题目要求我们寻找 可以被 k 整除数组,很好理解。...整体框架与Leetcode 560. K 数组类似,但是如何计算出最长数组。

    8510

    LeetCode 523. 连续数组(求余 哈希)

    题目 给定一个包含非负数数组一个目标整数 k,编写一个函数来判断该数组是否含有连续数组,其大小至少为 2,总和为 k 倍数,即总和为 n*k,其中 n 也是一个整数。...示例 1: 输入: [23,2,4,6,7], k = 6 输出: True 解释: [2,4] 是一个大小为 2 数组,并且为 6。...示例 2: 输入: [23,2,6,4,7], k = 6 输出: True 解释: [23,2,6,4,7]是大小为 5 数组,并且为 42。...解题 类似题目: LeetCode 560. K数组(前缀差分) LeetCode 862. 至少为 K 最短数组(前缀+deque单调栈) LeetCode 974....可被 K 整除数组(哈希map) 对前n个数求和,每次k取余,存入哈希表m[sum%k] = i 再次找到时,表明存在区间k倍数 class Solution { public

    49320

    LeetCode 2261. 含最多 K 个可整除元素数组

    题目 给你一个整数数组 nums 两个整数 k p ,找出并返回满足要求不同数组数,要求子数组中最多 k可被 p 整除元素。...示例 1: 输入:nums = [2,3,3,2,2], k = 2, p = 2 输出:11 解释: 位于下标 0、3 4 元素都可以被 p = 2 整除。...共计 11 个不同数组都满足最多含 k = 2 个可以被 2 整除元素: [2]、[2,3]、[2,3,3]、[2,3,3,2]、[3]、[3,3]、[3,3,2]、[3,3,2,2]、[3,2]、...注意,尽管子数组 [2] [3] 在 nums 中出现不止一次,但统计时只计数一次。 数组 [2,3,3,2,2] 不满足条件,因为其中有 3 个元素可以被 2 整除。...此外,nums 中每个子数组都满足最多 4 个元素可以被 1 整除。 因为所有数组互不相同,因此满足所有限制条件数组总数为 10 。

    31530

    LeetCode 周赛上分之旅 #44 同余前缀问题与经典倍增 LCA 算法

    统计趣味数组数目(Medium) https://leetcode.cn/problems/count-of-interesting-subarrays/ 题解(同余 + 前缀 + 散列表) 初步分析...: 问题目标: 统计数组中满足目标条件数组; 目标条件: 在数组范围 [l, r] 内,设 cnt 为满足 nums[i] % m == k 索引 i 数量,并且 cnt %...大白话就是算一下有多少数模是 k ,再判断个数模是不是也是 k ; 权重: 对于满足 nums[i] % m == k 元素,它对结果贡献是 1 ,否则是 0 ; 分析到这里,容易想到用前缀实现...return ret } } 复杂度分析时间复杂度: O(n) 线性遍历,单次查询时间为 O(1) ; 空间复杂度: O(m) 散列表空间。...K 数组 974. 可被 K 整除数组 523. 连续数组 525. 连续数组 ---- T4.

    28930

    LeetCode 862. 至少为 K 最短数组(前缀+deque单调栈)

    题目 返回 A 最短非空连续数组长度,该数组至少为 K 。 如果没有至少为 K 非空子数组,返回 -1 。...示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A = [1,2], K = 4 输出:-1 示例 3: 输入:A = [2,-1,2], K = 3 输出:3 提示...: 1 <= A.length <= 50000 -10 ^ 5 <= A[i] <= 10 ^ 5 1 <= K <= 10 ^ 9 来源:力扣(LeetCode) 链接:https://leetcode-cn.com...解题 类似题目: LeetCode 560. K数组(前缀差分) LeetCode 523. 连续数组(求余 哈希) LeetCode 974....可被 K 整除数组(哈希map) 参考官方思路 deque存储前缀下标,队内前缀需要严格单调递增 跟队首差值 >= k 时,记录最小长度,删除队首 ?

    44920

    【算法专题】前缀

    题目数据 保证 数组 nums之中任意元素全部前缀元素后缀乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度内完成此题。...K数组 题目链接 -> Leetcode -560.K数组 Leetcode -560.K数组 题目:给你一个整数数组 nums 一个整数 k ,请你统计并返回 该数组中和为...可被K整除数组 题目链接 -> Leetcode -974.可被K整除数组 Leetcode -974.可被K整除数组 题目:给定一个整数数组 nums 一个整数 k ,返回其中元素之和可被...k 整除(连续、非空) 数组 数目。...连续数组 题目链接 -> Leetcode -525.连续数组 Leetcode -525.连续数组 题目:给定一个二进制数组 nums, 找到含有相同数量 0 1 最长连续数组,并返回该数组长度

    10910

    TOP-K问题向上调整算法向下调整算法时间复杂度问题分析

    TOP-K问题 TOP-K问题:即求数据结合中前K个最大元素或者最小元素,一般情况下数据量都比较大 比如:专业前10名、世界500强、富豪榜、游戏中前100活跃玩家等 对于Top-K问题,能想到最简单直接方式就是排序...= 5; top_k(a, 1000, k); } 向上调整算法向下调整算法时间复杂度 因为堆是完全二叉树,而满二叉树也是完全二叉树,此处为了简化使用满二叉树来证明(时间复杂度本来看就是近似值,...多几个节点不影响最终结果): 我们令高度为h,节点个数n就等于2^(h)-1个 那么在向上调整算法中: 最坏情况下,最后一层节点需要向上移动h-1次,依次类推,就得到总次数表达式,然后再用错位相减法...nh关系就能求出时间复杂度f(n)了 在向下调整算法中: 最坏情况下,倒数第二层节点向下只移动一次,第一层最多移动h-1次 总结下来我们就会发现,向上调整算法中是多节点乘多层数关系,而向下调整算法则是多节点乘少层数关系...,我们进行比较就会发现其实向下调整算法效率更高,所以在平常排序建堆中我们 最常用还是向下调整算法 向上调整算法时间复杂度为: n*log(n) 向下调整算法时间复杂度为: log(n

    9510

    【优选算法题练习】day8

    一、974. 可被 K 整除数组 1.题目简介 974....可被 K 整除数组 给定一个整数数组 nums 一个整数 k ,返回其中元素之和可被 k 整除(连续、非空) 数组 数目(数组 是数组 连续 部分)。...连续数组 给定一个二进制数组 nums , 找到含有相同数量 0 1 最长连续数组,并返回该数组长度。...) e = -1; } //将数组中0转化为-1,这样问题就转变为为0最长连续数组,推测为找为sum最短连续数组 int sum = 0;...K 数组 1.题目简介 560. K 数组 给你一个整数数组 nums 一个整数 k ,请你统计并返回 该数组中和为 k 连续数组个数 。

    13020

    K数组(LeetCode 560)

    文章目录 1.问题描述 2.难度等级 3.热门指数 4.解题思路 方法一:枚举 方法二:前缀 + 哈希表优化 参考文献 1.问题描述 给你一个整数数组 nums 一个整数 k ,请你统计并返回 该数组中和为...考虑以 i 结尾k 连续数组个数,我们需要统计符合条件下标 j 个数,其中 0≤j≤i 且 [j…i] 这个子数组恰好为 k 。...可能有读者会认为假定我们确定了数组开头结尾,还需要 O(n) 时间复杂度遍历数组来求和,那样复杂度就将达到 O(n^3) 从而无法通过所有测试用例。...时间复杂度: O(n^2),其中 n 为数组长度。枚举子数组开头结尾需要 O(n^2) 时间,其中求和需要 O(1) 时间复杂度,因此总时间复杂度为 O(n^2)。 空间复杂度: O(1)。...我们遍历数组时间复杂度为 O(n),中间利用哈希表查询删除复杂度均为 O(1),因此总时间复杂度为 O(n)。 空间复杂度: O(n),其中 n 为数组长度。

    18110

    LeetCode题解——k 数组

    更新一篇发布在力扣上题解,900+watch记录一波,题目链接: https://leetcode-cn.com/problems/QTMn0o/ 解题思路 1、 本题需要求出数组之和为k数组个数...我们可以先统计一下前n项值出现次数,也就是所谓前缀,这里将前缀为0也统计进来: 1) 此时假设k=6,我们肉眼可见数组值为6是【1,2,3】,那么对应到前缀里面就是 3 这个位置,...它其实可以看成 3 - 0 得到区间值; 2) 再假设k=7,那么我们可以发现数组值为7是【3,4】,此时我们可以发现在前缀中没有找到值为7,那么说明该数组起始位置并非0;此时按照滑动窗口思路就应该移动左指针...k数组了。...hash表中寻找键值是sum-k,因为直接寻找k只可以找到那些起始位置为0数组,而寻找sum-k因为我们事先插入了一个0键值,因此这里也不会忽略掉这种情况。

    1K20

    Leetcode 560. K 数组

    K 数组 题目描述:给你一个整数数组 nums 一个整数 k ,请你统计并返回 该数组中和为 k 连续数组个数 。...我们可以枚举[0..i]里所有的下标 j 来判断是否符合条件,可能有读者会认为假定我们确定了数组开头结尾,还需要 O(n 时间复杂度遍历数组来求和,那样复杂度就将达到 O(n^3),从而无法通过所有测试用例...枚举子数组开头结尾需要 O(n^2)时间,其中求和需要 O(1) 时间复杂度,因此总时间复杂度为 O(n^2)。 空间复杂度:O(1)。只需要常数空间存放若干变量。...pre[i]−pre[j−1]==k 简单移项可得符合条件下标 jj 需要满足 pre[j−1]==pre[i]−k 所以我们考虑以 i结尾k 连续数组个数时只要统计有多少个前缀为pre...return count; } }; 复杂度分析 时间复杂度:O(n),其中 n 为数组长度。

    70630

    LeetCode560. K数组

    思路 首先想到是暴力求解,双重循环得出所有连续串,但是多半要超时。没想到其他办法。看了题解,学到了前缀概念,这里等于end前缀减去start前缀。...在前缀基础上,结合了hash来优化,也就是两数之和那道题。 两个地方需要注意。一、需要前缀可能出现多次,那么每次都得算上。二、前缀为0也是一种情况,并且是必要,需要手动添加。...题目 给定一个整数数组一个整数 k,你需要找到该数组中和为 k 连续数组个数。...数组中元素范围是 [-1000, 1000] ,且整数 k 范围是 [-1e7, 1e7]。...// 串长度为0(在母串最前面),前缀为0,出现次数+1(原本为0) qzh.put(0, 1); // 前缀 int sum

    23020

    LeetCode-560-K数组

    # LeetCode-560-K数组 给定一个整数数组一个整数 **k,**你需要找到该数组中和为 k 连续数组个数。...https://leetcode-cn.com/problems/subarray-sum-equals-k/solution/dai-ni-da-tong-qian-zhui-he-cong-zui-ben-fang-fa-y...]−k 所以我们考虑以i结尾k连续数组个数时只要统计有多少个前缀为 sum[i]−k sum[j]即可。...我们建立哈希表 mp,以为键,出现次数为对应值,记录 sum[i]出现次数,从左往右边更新 mp边计算答案,那么以 i结尾答案 mp[sum[i]−k] 即可在 O(1)时间内得到。...最后答案即为所有下标结尾k数组个数之和。 需要注意是,从左往右边更新边计算时候已经保证了mp[sum[i]−k]里记录 sum[j]下标范围是 0≤j≤i 。

    23110
    领券