当前位置: 首页 > 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.xdnf.cn/news/773875.html

相关文章:

  • 复变函数 $w = z^2$ 的映射图像演示
  • 电商 API 开发实战:唯品会商品详情页实时数据接口接入与调试
  • 【Python 进阶2】抽象方法和实例调用方法
  • 激光雷达的强度像和距离像误差与噪声分析(2)2025.6.2
  • ps反相调整
  • 西红柿番茄成熟度目标检测数据集介绍
  • RSCUcaller
  • C语言进阶知识:深入探索编程的奥秘
  • 免费的硬盘工具
  • c++ 赋值函数和拷贝构造函数的调用时机
  • 【Pytorch学习笔记】模型模块06——hook函数
  • ps色彩平衡调整
  • java反序列化: Transformer链技术剖析
  • DAX权威指南6:DAX 高级概念(扩展表)、DAX 计算常见优化
  • 集成测试的流程总结
  • 【Kubernetes-1.30】--containerd部署
  • 工作日记之权限校验-token的实战案例
  • 基于Android的医院陪诊预约系统
  • 九(2).参数类型为引用结构体类型
  • css呼吸灯
  • 详细解析2MHz和3MHz压电陶瓷片的区别
  • 数据库-数据查询
  • 数学建模期末速成 多目标规划
  • 设计模式——迭代器设计模式(行为型)
  • ToolsSet之:数值提取及批处理
  • Spring Cloud 开发入门:环境搭建与微服务项目实战(上)
  • 学到新的日志方法mp
  • vue router详解和用法
  • Windows10-ltsc-2019 使用 PowerShell 安装安装TranslucentTB教程(不通过微软商店安装)
  • PCA(K-L变换)人脸识别(python实现)