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

剑指 Offer II 010. 和为 k 的子数组


comments: true
edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20010.%20%E5%92%8C%E4%B8%BA%20k%20%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/README.md

剑指 Offer II 010. 和为 k 的子数组

题目描述

给定一个正整数数组和一个整数 k请找到该数组中和为 k 的连续子数组的个数。

 

示例 1 :

输入:nums = [1,1,1], k = 2
输出: 2
解释: 此题 [1,1] 与 [1,1] 为两种不同的情况

示例 2 :

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

 

提示:

  • 1 <= nums.length <= 2 * 104
  • 1000 <= nums[i] <= 1000
  • -107 <= k <= 107

 

注意:本题与主站 560 题相同: https://leetcode.cn/problems/subarray-sum-equals-k/

解法

方法一:哈希表 + 前缀和

**由于数组中既有正数又有负数,无法使用双指针。**我们可以使用哈希表记录每个前缀和出现的次数,从而在 O ( 1 ) O(1) O(1) 的时间内得到以当前位置为右端点的子数组中和为 k k k 的子数组个数。

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)。其中 n n n 是数组的长度。

在这里插入图片描述

Python3
class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        presm_j=0
        sm_cnt={0:1} # 前缀和为0的个数,即子数组个数 为1

        res=0
        for x in nums:
            presm_j+=x

            presm_i_1=presm_j-k #
            res+=sm_cnt.get(presm_i_1,0)
            sm_cnt[presm_j]=sm_cnt.get(presm_j,0)+1 #记录前缀和为presm_j的个数
        return res
Java
class Solution {
    public int subarraySum(int[] nums, int k) {
        Map<Integer, Integer> cnt = new HashMap<>();
        cnt.put(0, 1);
        int ans = 0, s = 0;
        for (int x : nums) {
            s += x;
            ans += cnt.getOrDefault(s - k, 0);
            cnt.merge(s, 1, Integer::sum);
        }
        return ans;
    }
}
C++
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        unordered_map<int, int> cnt;
        cnt[0] = 1;
        int ans = 0, s = 0;
        for (int x : nums) {
            s += x;
            ans += cnt[s - k];
            cnt[s]++;
        }
        return ans;
    }
};
Go
func subarraySum(nums []int, k int) (ans int) {
	cnt := map[int]int{0: 1}
	s := 0
	for _, x := range nums {
		s += x
		ans += cnt[s-k]
		cnt[s]++
	}
	return
}
TypeScript
function subarraySum(nums: number[], k: number): number {
    const cnt: Map<number, number> = new Map();
    cnt.set(0, 1);
    let ans = 0;
    let s = 0;
    for (const x of nums) {
        s += x;
        ans += cnt.get(s - k) ?? 0;
        cnt.set(s, (cnt.get(s) ?? 0) + 1);
    }
    return ans;
}
Swift
class Solution {
    func subarraySum(_ nums: [Int], _ k: Int) -> Int {
        var cnt: [Int: Int] = [0: 1]
        var ans = 0
        var s = 0

        for x in nums {
            s += x
            ans += cnt[s - k, default: 0]
            cnt[s, default: 0] += 1
        }

        return ans
    }
}

http://www.kler.cn/a/526368.html

相关文章:

  • 如何用 Groq API 免费使用 DeepSeek-R1 70B,并通过 Deno 实现国内访问
  • [Java]泛型(一)泛型类
  • 算法每日双题精讲 —— 前缀和(【模板】一维前缀和,【模板】二维前缀和)
  • Golang笔记——常用库context和runtime
  • 動態住宅IP提升網站訪問成功率
  • 【C语言】static关键字的三种用法
  • 设计模式Python版 建造者模式
  • 登录管理——认证方案(JWT、拦截器、ThreadLocal、短信验证)
  • 数据采集丨豆瓣电影详细数据的采集与可视化分析(scrapy+mysql+matplotlib+flask)
  • 遗传算法【Genetic Algorithm(GA)】求解函数最大值(MATLAB and Python实现)
  • 零碎的知识点(十二):卷积神经网络CNN通道数的理解!
  • 光伏设计新利器:绿虫仿真设计软件的优势
  • 【教学类-89-04】20250130新年篇04——九叠篆印章(九叠篆站+Python下载图片+Python组合文字)幼儿名字印章
  • CAPL学习资源推荐
  • 7层还是4层?网络模型又为什么要分层?
  • 乐理笔记——DAY02
  • 【深度分析】微软全球裁员计划不影响印度地区,将继续增加当地就业机会
  • 【浏览器 - Mac实时调试iOS手机浏览器页面】
  • AI DeepSeek-R1 Windos 10 环境搭建
  • 数据库简介-01
  • JavaScript 进阶(下)
  • 全国31省空间权重矩阵(地理相邻空间、公路铁路地理距离空间、经济空间)权重矩阵数据-社科数据
  • 【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点
  • 下载一个项目到跑通的大致过程是什么?
  • Win10安装MySQL、Pycharm连接MySQL,Pycharm中运行Django
  • 内容检索(2025.01.30)