news 2026/10/26 1:59:06

560.和为k的子数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
560.和为k的子数组

一、题目描述

给你一个整数数组nums和一个整数k,请你统计并返回该数组中和为k的子数组的个数。

子数组是数组中元素的连续非空序列。

示例 1:

输入:nums = [1,1,1], k = 2 输出:2

示例 2:

输入:nums = [1,2,3], k = 3 输出:2

提示:

  • 1≤nums.length≤2×1041 \le nums.length \le 2 \times 10^41≤nums.length≤2×104
  • −1000≤nums[i]≤1000-1000 \le nums[i] \le 1000−1000≤nums[i]≤1000
  • −107≤k≤107-10^7 \le k \le 10^7−107≤k≤107

⚠️ 重点:数组包含负数!不能用滑动窗口双指针!

二、暴力解法分析(超时)

最容易想到的思路:枚举子数组起点和终点,累加区间和判断是否等于k。
两层循环,时间复杂度O(n2)O(n^2)O(n2)。
当 n 达到 2e4 时,运算量高达 4e8,一定会超时,无法通过。

三、前缀和核心思想

前缀和pre[i]:数组从下标 0 加到下标 i 的总和。
区间[j+1,i][j+1, i][j+1,i]的和公式:
sum=pre[i]−pre[j]sum = pre[i] - pre[j]sum=pre[i]−pre[j]
题目要求区间和等于 k:
pre[i]−pre[j]=kpre[i] - pre[j] = kpre[i]−pre[j]=k
变形得到:
pre[j]=pre[i]−kpre[j] = pre[i] - kpre[j]=pre[i]−k

含义:遍历到 i 的时候,只要前面已经出现过前缀和等于pre[i] - k,就对应一组合法连续子数组。

四、前缀和 + 哈希表优化思路

哈希表作用:记录每个前缀和出现的次数
初始化:mp[0] = 1
作用:处理pre[i] == k的场景,也就是从数组开头到 i 的子数组满足条件。

遍历流程:

  1. 当前前缀和加上当前元素
  2. 查询pre - k是否存在哈希表,存在则把对应次数加到答案
  3. 将当前前缀和更新进哈希表,计数+1

✅ 顺序不能颠倒:先查询,再存入哈希表,避免重复使用当前位置

五、C++ 代码实现

#include <unordered_map> #include <vector> using namespace std; class Solution { public: int subarraySum(vector<int>& nums, int k) { unordered_map<int, int> mp; mp[0] = 1; int pre = 0, res = 0; for (int x : nums) { pre += x; if (mp.find(pre - k) != mp.end()) { res += mp[pre - k]; } mp[pre]++; } return res; } };

六、Python 代码实现

from collections import defaultdict from typing import List class Solution: def subarraySum(self, nums: List[int], k: int) -> int: cnt = 0 pre = 0 hashmap = defaultdict(int) hashmap[0] = 1 for x in nums: pre += x if pre - k in hashmap: cnt += hashmap[pre - k] hashmap[pre] += 1 return cnt

七、复杂度分析

  • 时间复杂度:(O(n))(O(n))(O(n)),数组一次遍历,哈希表查询平均(O(1))(O(1))(O(1))
  • 空间复杂度:(O(n))(O(n))(O(n)),哈希表最多存储 n 个前缀和

八、高频易错点总结

  1. 数组存在负数,前缀和不单调,不能用双指针滑动窗口
  2. 必须初始化mp[0] = 1,很多人漏掉这个条件导致样例不通
  3. 操作顺序:先查pre-k,再更新哈希表,不能反过来
  4. 相同前缀和需要累加次数,不是只记录是否存在

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 1:58:16

【RAG项目】02、RAG项目-文本上传WEB服务

离线流程安装streamlit pip install streamlitimport streamlit as st from sympy import false# 添加网页标题 st.title("知识库更新服务")uploader_file st.file_uploader("请上传txt文件",type ["txt"],accept_multiple_filesfalse )if upl…

作者头像 李华
网站建设 2026/10/26 1:56:57

Redis命令:SINTERSTORE

Redis SINTERSTORE 命令详细教程 SINTERSTORE 计算多个集合的交集&#xff0c;并把结果写入指定的目标 Key&#xff0c;返回写入的成员数量。它是 SINTER 的写版本&#xff1a;SINTER 把交集返回给客户端&#xff0c;SINTERSTORE 把交集留在 Redis 里&#xff0c;便于缓存、后…

作者头像 李华
网站建设 2026/10/26 1:56:00

五看三定如何收敛为可投资战略机会点:SPAN图与商业画布实战

简介&#xff1a;这份PDF面向企业管理者、战略规划及人力资源从业者&#xff0c;系统拆解华为“五看三定”战略管理框架&#xff0c;帮助读者理解从战略洞察、战略制定、战略解码到战略执行与评估的完整链路&#xff0c;并聚焦“五看”如何输出战略机会点。压缩包内仅含一个PDF…

作者头像 李华
网站建设 2026/10/26 1:54:30

Flink CDC 3.0:MySQL 到 Doris 实时同步与整库接入

简介&#xff1a;《Flink CDC 3.0&#xff1a;MySQL数据实时捕获与同步至Doris的全流程解析及应用案例》由尚硅谷研究院编写&#xff0c;面向具备Flink基础的大数据研发与实时同步工程师&#xff0c;帮助读者理解CDC原理并落地MySQL到Doris的Streaming ETL。文档先厘清变更数据…

作者头像 李华
网站建设 2026/10/26 1:53:38

具身智能协同演化动力学(118):具身智能的认知桥梁与文化基因详解

前沿技术探索:FRA核心定义与设计理念 FRA(Factorized Robotic Agent, FRA,亦称:因式分解机器人智能体)是一套因式化数实融合一体化新型智能系统,核心设计理念是全链路系统解耦,将机器人作业的感知、推理、动作执行三大核心能力拆解为独立平行子模块,整合为统一、闭环、…

作者头像 李华