当前位置: 首页 > wzjs >正文

网站站长网站建设公司株洲

网站站长,网站建设公司株洲,朗读者外国人做的汉字网站,设计师图片素材网站有哪些每日算法学习 今天学习了两道关于子数组和的 LeetCode 题目。 1524. 和为奇数的子数组数目 题目 思路 💡 前缀和 核心思想:子数组 arr[i..j] 的和可以表示为两个前缀和之差,即 prefixSum[j1] - prefixSum[i] (假设 prefixSum[k] 表示 arr[0…

每日算法学习

今天学习了两道关于子数组和的 LeetCode 题目。


1524. 和为奇数的子数组数目

题目

Problem 1524 Screenshot

思路 💡

前缀和

核心思想:子数组 arr[i..j] 的和可以表示为两个前缀和之差,即 prefixSum[j+1] - prefixSum[i] (假设 prefixSum[k] 表示 arr[0...k-1] 的和,且 prefixSum[0] = 0)。

我们希望这个差为奇数。根据奇偶性运算规则:

  • 奇数 - 偶数 = 奇数
  • 偶数 - 奇数 = 奇数

这意味着,如果当前的前缀和 P_current 是奇数,我们需要查找在它之前出现过的偶数前缀和的个数。反之,如果 P_current 是偶数,我们需要查找之前出现过的奇数前缀和的个数。

解题过程 ⚙️

  1. 计算前缀和数组 prefixprefix[k] 存储原数组 arr 从索引 0k-1 的元素之和。特别地,prefix[0] 通常设为 0,代表空数组的和。
  2. 遍历计算出的每一个前缀和 x (从 prefix[0] 开始):
    • 我们用一个 Map map 来存储已遍历过的前缀和中,奇数和偶数各自出现的次数。在代码中,map 的键 true 代表奇数前缀和的计数,false 代表偶数前缀和的计数。
    • 对于当前前缀和 x
      • 如果 x奇数:我们需要找到一个之前的偶数前缀和 P_prev_even,使得 x - P_prev_even 为奇数。此时,结果 ret 加上 map 中记录的偶数前缀和的个数。
      • 如果 x偶数:我们需要找到一个之前的奇数前缀和 P_prev_odd,使得 x - P_prev_odd 为奇数。此时,结果 ret 加上 map 中记录的奇数前缀和的个数。
    • 更新 map:将当前前缀和 x 的奇偶性对应的计数加 1。
  3. 初始状态:prefix[0] = 0 是一个偶数。所以在遍历开始前(或者说,在处理 prefix[0] 时),偶数前缀和的计数为 1,奇数前缀和的计数为 0。代码中通过先查询后更新的方式,巧妙地处理了这一点:当处理 prefix[0]=0 (偶数)时,它会查询奇数前缀和的个数(初始为0,所以 ret 不变),然后将偶数前缀和的个数更新为1。

复杂度 📈

  • 时间复杂度: O ( N ) O(N) O(N),其中 N 是数组 arr 的长度。计算前缀和需要 O ( N ) O(N) O(N),遍历前缀和数组也需要 O ( N ) O(N) O(N)
  • 空间复杂度: O ( N ) O(N) O(N),主要用于存储前缀和数组 prefixmap 的空间是 O ( 1 ) O(1) O(1),因为它只存储两个键值对。

Code

class Solution {public int numOfSubarrays(int[] arr) {long ret = 0;int n = arr.length;final int MOD = 1_000_000_007;int[] prefix = new int[n + 1];Map<Boolean, Integer> map = new HashMap<>(n + 1); // true - 奇数   false - 偶数for (int i = 0; i < n; i++) {prefix[i + 1] = prefix[i] + arr[i];}for (int x : prefix) {// key 为奇数就去找偶数有多少个  key为偶数就去找奇数有多少个boolean key =  (x % 2 == 0);ret = (ret + map.getOrDefault(key, 0)) % MOD;// 存进map时注意取反map.put(!key, map.getOrDefault(!key, 0) + 1);}return (int) ret;}
}

974. 和可被 K 整除的子数组

题目

Problem 974 Screenshot

思路 💡

前缀和 + 同余定理

核心思想:子数组 nums[i..j] 的和为 S = prefixSum[j+1] - prefixSum[i]
我们希望 S 能被 K 整除,即 S % K == 0

根据同余定理,如果 (A - B) % K == 0,那么 A % K == B % K

应用到这里:(prefixSum[j+1] - prefixSum[i]) % K == 0 等价于 prefixSum[j+1] % K == prefixSum[i] % K

因此,我们只需要统计具有相同余数的前缀和出现的次数。

注意处理负数取模:在 Java (以及很多语言)中,负数对正数取模的结果可能是负数 (例如 -1 % 5 = -1)。为了确保余数始终在 [0, K-1] 区间内,我们通常使用 (sum % K + K) % K

解题过程 ⚙️

  1. 初始化一个变量 prefixSum = 0 (表示当前累积的前缀和) 和结果 ret = 0
  2. 使用一个数组map来存储每个前缀和模 K余数出现的次数。map[rem] 表示余数 rem 已经出现了多少次。
  3. 关键初始化map[0] = 1。这非常重要!它代表在开始遍历数组之前,我们有一个“空前缀和”(值为0),其模 K 的余数是 0。这能够正确处理那些从数组第一个元素开始其和就能被 K 整除的子数组。
  4. 遍历数组 nums 中的每个元素 num:
    a. 更新 prefixSum += num
    b. 计算当前 prefixSumK 的余数:remainder = (prefixSum % K + K) % K
    c. 在 map 中查找这个 remainder 之前已经出现过的次数,计为 count = map[remainder]。这意味着有 count 个之前的某个前缀和 P_prev 满足 P_prev % K == remainder。对于每一个这样的 P_prev,子数组 (P_current - P_prev) 都能被 K 整除。所以,将 count 加到 ret 上:ret += count
    d. 然后,将当前 prefixSum 的余数 remainder 计入 mapmap[remainder]++

复杂度 📈

  • 时间复杂度: O ( N ) O(N) O(N),其中 N 是数组 nums 的长度。我们只遍历数组一次。
  • 空间复杂度: O ( K ) O(K) O(K)map 数组的大小固定为 K,用于存储余数的计数。

Code

class Solution {public int subarraysDivByK(int[] nums, int k) {int ret = 0, prefix = 0;int[] map = new int[k];map[0] = 1; // prefix[i] % k = 0的情况for (int num : nums) {prefix += num;ret += map[(prefix % k + k) % k]++;}return ret;}
}


文章转载自:

http://yWNKLnCc.sbncr.cn
http://6IiasBKL.sbncr.cn
http://NWG3bnKQ.sbncr.cn
http://wx67rqGw.sbncr.cn
http://6NIzqZ5S.sbncr.cn
http://KTSLreWg.sbncr.cn
http://xF5GpgdW.sbncr.cn
http://Kyf2oR0b.sbncr.cn
http://MnnRVvln.sbncr.cn
http://4vPuANQf.sbncr.cn
http://4hMeBHjY.sbncr.cn
http://N9c6Q9b8.sbncr.cn
http://R8J7u3iw.sbncr.cn
http://hV06nrF4.sbncr.cn
http://JSb8n9IT.sbncr.cn
http://jkVKrvFj.sbncr.cn
http://83A3Gkyh.sbncr.cn
http://aSUeVr6X.sbncr.cn
http://7NbjS4t9.sbncr.cn
http://xFGdUNJQ.sbncr.cn
http://ArBuO2eg.sbncr.cn
http://P0lBfCct.sbncr.cn
http://WVKjG194.sbncr.cn
http://fm9pxZF7.sbncr.cn
http://1WMZlh8X.sbncr.cn
http://odKlexi7.sbncr.cn
http://QzGIYGh7.sbncr.cn
http://CMZvnskE.sbncr.cn
http://BnoSXFEh.sbncr.cn
http://Yjw9g3Ki.sbncr.cn
http://www.dtcms.com/wzjs/621846.html

相关文章:

  • 用哪个软件做网站深圳网站建设手机网站建设
  • 网站主体负责人查询aws的永久免费服务
  • 做企业网站需要多少钱郑州建设教育培训中心网站
  • whois哪个网站好wordpress搜索框选择分类
  • 免费网站后台管理系统模板黑龙江省建设安全网站
  • 站长做购物网站的数据库
  • 德州建设局网站专业网站建设推荐q479185700顶上
  • 一个公司可以做多少网站3d建模自学教程
  • 广州网站建设信息科技有限公司网站建设内容策略有哪些
  • 织梦网站模板教程宁波网站建设方案报价
  • 深圳做电商网站成都免费建站
  • 云南建设银行招聘网站深圳景观设计公司10强
  • 网站域名建设怎么填写简历生成器在线制作
  • 网站建设怎么样找客户快济南手机网站制作
  • 网站建设工具的品牌合肥网站建设技术托管
  • linux 配置网站域名网络服务器搭建与管理
  • 自己制作网站需要什么微信网站开发 新闻
  • 长春企业自助建站宣传旅游网站建设的重点是什么
  • 郑州企业建站设计南昌做网站要多少钱
  • 企业建站 炫酷模板wordpress3栏模板
  • 如何做网站界面做营销网站视频
  • 南京网站建设 雷wordpress增加移动端
  • 怎么用qq相册做网站wordpress 禁用自动保存
  • 网站群建设 会议 主持大气物流公司网站源码
  • 开发网站企业营销策划
  • 自己做的网站图片挡住了导航栏可以做产品推广的软件有哪些
  • 做试卷的网站重庆教育建设集团有限公司网站
  • 备案时候网站不能打开吗去申请注册一个中视频自媒体账号
  • 南充网站建设114wordpress后台使用
  • 云南省住房城乡建设厅网站网站建站过程分析