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

每日算法-250602

每日算法学习记录 - 250602

今天学习和复习了两道利用前缀和与哈希表解决的子数组问题,特此记录。

560. 和为 K 的子数组

题目

LeetCode Problem 560 Screenshot

思路

本题的核心思想是利用 前缀和哈希表 来优化查找过程。

解题过程

题目要求统计和为 k 的子数组个数。

  1. 我们首先预处理出一个前缀和数组 prefix,其中 prefix[i] 表示原数组 nums 中区间 [0, i-1] 的元素之和。特别地,prefix[0] = 0
  2. 对于任意子数组 nums[i...j-1] (假设 j > i),其和可以表示为 prefix[j] - prefix[i]
  3. 我们目标是找到满足 prefix[j] - prefix[i] = k(i, j) 对的个数。
  4. 将上式变形,得到 prefix[i] = prefix[j] - k
  5. 我们可以遍历计算出的 prefix 数组(从 prefix[0]prefix[n],其中 nnums 的长度)。当遍历到 prefix[j](在代码中用变量 x 表示)时,我们希望在 之前已经遇到过 的前缀和中查找是否存在一个 prefix[i],使得 prefix[i] == prefix[j] - k
  6. 使用一个哈希表 map 来存储已经遍历过的前缀和 sum_val 及其出现的次数 count (即 map<sum_val, count>)。
  7. 当我们遍历 prefix 数组,对于当前的元素 x (它代表一个 prefix[j])

这样,通过一次遍历,我们就能统计出所有和为 k 的子数组数量。

复杂度

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N 是数组 nums 的长度。计算前缀和数组需要 O ( N ) O(N) O(N),遍历前缀和数组并操作哈希表(插入和查找平均 O ( 1 ) O(1) O(1))也需要 O ( N ) O(N) O(N)
  • 空间复杂度: O ( N ) O(N) O(N),主要用于存储前缀和数组和哈希表。在最坏情况下,哈希表可能存储 N + 1 N+1 N+1 个不同的前缀和。

Code

class Solution {public int subarraySum(int[] nums, int k) {int ret = 0, n = nums.length;int[] prefix = new int[n + 1];Map<Integer, Integer> map = new HashMap<>(n + 1);for (int i = 0; i < n; i++) {prefix[i + 1] = prefix[i] + nums[i];}for (int x : prefix) {int key = x - k;ret += map.getOrDefault(key, 0);map.put(x, map.getOrDefault(x, 0) + 1);}return ret;}
}

930. 和相同的二元子数组(复习)

题目

LeetCode Problem 930 Screenshot

说明

这道题是复习题。之前使用过滑动窗口的解法(可参考 每日算法-250404),本次采用与上一题 (560. 和为 K 的子数组) 类似的 前缀和 + 哈希表 思路。

由于解题逻辑与上一题高度一致(只是目标和从 k 变成了 goal),这里不再赘述详细过程,仅列出代码实现。核心都是计算前缀和,然后查找 current_prefix_sum - goal 是否在哈希表中出现过。

代码

class Solution {public int numSubarraysWithSum(int[] nums, int goal) {int ret = 0, n = nums.length;int[] prefixSum = new int[n + 1];Map<Integer, Integer> map = new HashMap<>(n + 1);for (int i = 0; i < n; i++) {prefixSum[i + 1] = prefixSum[i] + nums[i];}for (int x : prefixSum) {int key = x - goal;ret += map.getOrDefault(key, 0);map.put(x, map.getOrDefault(x, 0) + 1);}return ret;}
}
http://www.lqws.cn/news/73315.html

相关文章:

  • Windows+VSCode搭建小智(xiaozhi)开发环境
  • 开源的JT1078转GB28181服务器
  • PDF 转 HTML5 —— HTML5 填充图形不支持 Even-Odd 奇偶规则?(第一部分)
  • 【Spring】RAG 知识库基础
  • Axure 基础入门
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Form Wave(表单label波动效果)
  • 自主设计一个DDS信号发生器
  • 每天掌握一个Linux命令 - hping3
  • 工作流引擎-16-开源审批流项目之 整合Flowable官方的Rest包
  • NiceGUI 是一个基于 Python 的现代 Web 应用框架
  • Windows10-ltsc-2019 使用 PowerShell 安装安装TranslucentTB教程(不通过微软商店安装)
  • Qt概述:基础组件的使用
  • 动态类型语言和静态类型语言
  • 【MySQL基础】库的操作:创建、删除与管理数据库
  • [ Qt ] | 与系统相关的操作(一):鼠标相关事件
  • 分布式锁优化:使用Lua脚本保证释放锁的原子性问题
  • 网络安全的学习路线是怎么样的?
  • 【C语言】C语言经典小游戏:贪吃蛇(下)
  • 用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?
  • 【iOS】YYModel源码解析
  • Git GitHub Gitee
  • ISBN书号查询接口如何用PHP实现调用?
  • 房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块
  • Python训练营打卡 Day26
  • JavaScript性能优化:实战技巧提升10倍速度
  • 2025年—Comfy UI 和 Stable Diffusion底层原理
  • docker可视化工具
  • 【头歌实验】Keras机器翻译实战
  • volatile,synchronized,原子操作实现原理,缓存一致性协议
  • 【JAVA后端入门基础001】Tomcat 是什么?通俗易懂讲清楚!