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

力扣-和为K的子数组

题目-和为 K 的子数组

在这里插入图片描述

解法1:两层for循环

public class T560 {public static int subarraySum(int[] nums, int k) {int res = 0;for (int i = 0; i < nums.length; i++) {int tempSum = 0;for (int j = i; j < nums.length; j++) {tempSum += nums[j];if (tempSum == k) {res++;}}}return res;}public static void main(String[] args) {int[] nums = {1, -1, 0};int k = 0;System.out.println(subarraySum(nums, k));}
}

解法2:前缀和+哈希

  • 前缀和:前缀和数组 sum[i] 表示从数组起点到位置 i 的元素之和。
  • 哈希表:使用哈希表记录前缀和出现的次数,这样在遍历数组时可以快速找到符合条件的子数组。
public class T560 {public static int subarraySum(int[] nums, int k) {int res = 0;Map<Integer, Integer> map = new HashMap<>();map.put(0, 1);// int currentSum = 0;for (int i = 0; i < nums.length; i++) {//sum[i...j]=sum[j]-sum[i-1]currentSum += nums[i];if (map.containsKey(currentSum - k)) {res += map.get(currentSum - k);}map.put(currentSum, map.getOrDefault(currentSum, 0) + 1);}return res;}public static void main(String[] args) {int[] nums = {1, -1, 0};int k = 0;System.out.println(subarraySum(nums, k));}
}

详细解释 currentSum - k
设 currentSum 表示当前的前缀和,也就是从数组起点到当前位置的元素之和。我们希望找到一个子数组,使得这个子数组的和等于 k。假设我们当前遍历到数组位置 j,当前的前缀和为 currentSum。

如果存在某个位置 i 使得从 i 到 j 的子数组和等于 k,根据前缀和的定义,有:sum[j]-sum[i-1]=k 其中sum[j]就是currentSum

变形一下:sum[j]-sum[i-1]=k ➡️sum[j]-k=sum[i-1]➡️currentSum-k=sum[i-1]。(因为已知k,不知道sum[i-1] ,所以把k移到等号左边,看map中是否包含sum[i-1],包含则说明ij的和为k


为什么是res += map.get(currentSum - k);而不是res += 1;因为可能存在多个前缀和为currentSum - k。搞懂map存的什么

http://www.lryc.cn/news/384859.html

相关文章:

  • 写一个坏越个人天地(五)
  • 步步精科技诚邀您参加2024慕尼黑上海电子展
  • Spring Boot中如何配置和使用多数据源
  • vue3 【提效】全局布局 vite-plugin-vue-layouts 实用教程
  • 前端性能优化-实测
  • 【Linux】初识操作系统
  • 等保2.0中,如何确保云服务提供商的数据主权合规?
  • 【AI大模型】Transformers大模型库(十四):Datasets Viewer
  • 一个例子理解傅里叶变换的计算过程
  • 2-2到2-4
  • Vatee万腾平台:一站式智慧服务,让生活更美好
  • 如何选择一个好的汽车油封制造商?
  • 构建高效的电商返利系统:架构设计与实现
  • 如何使用 Python 交互式解释器?
  • C++日期类的完整实现,以及this指针的const修饰等的介绍
  • 缓冲区溢出
  • step7:“模拟量界面”逻辑
  • Arduino - 继电器
  • 状态压缩DP——AcWing 327. 玉米田
  • kafka(二)安装部署(2)windows
  • aliplayer Server returned 403 Forbidden (access denied)
  • 单例模式(下)
  • 合约期VS优惠期,搞明白他们的区别才能避免很多坑!
  • 函数式反应式编程(FRP)在Scala中的实践与探索
  • NGINX配置web文件服务
  • deepspeed docker集群实现多机多卡训练----问题记录及解决方案资源汇总
  • 恢复 IntelliJ IDEA 中消失的菜单栏
  • 漏洞利用开发基础学习记录
  • 云通SIPX,您的码号资源智能调度专家!
  • 04-Mysql 索引,事务