首页 > 其他分享 >560. 和为 K 的子数组(中)

560. 和为 K 的子数组(中)

时间:2024-10-29 16:42:57浏览次数:1  
标签:pre 前缀 nums 560 元素 mp 数组

目录

题目

  • 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。

示例 1:

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

示例 2:

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

法一、暴力枚举

  • 思路:两层for循环,一层遍历数组,第二层根据第一层的当前元素作为子数组的最后一个元素,往前每一步都求和一直到nums第一个元素
var subarraySum = function(nums, k) {
    let cnt=0
    //遍历nums数组
    for(let start=0;start<nums.length;++start){
        let sum=0//当前子数组和
        //把当前遍历到的元素作为子数组的最后一个元素,往前求和
        for(let end=start;end>=0;end--){
            sum+=nums[end]
            if(sum==k){
                cnt++
            }
        }
    }
    return cnt
};

法二、前缀和 + 哈希表优化

  • 前缀和:当前元素及其之前元素的和,可以用来求子数组和,比如:nums=[3,4,7,2,-3]则pre=[3,7,14,16,13]那么pre[4]-pre[1]=6=nums[2]+nums[3]+nums[4]
  • 思路:求子数组和为k的个数,相当于求pre[i]-pre[j-1]=k的个数,可移项得pre[j-1]=pre[i]-k只需要统计pre[j-1]的个数。统计使用一个哈希表,以pre[i]作键,pre[i]出现的次数作值,最后统计哈希表中pre[j-1](或者pre[i]-k)出现的次数
var subarraySum = function(nums, k) {
    // 创建一个映射,用于存储前缀和及其出现次数
    const mp = new Map();
    // 初始化映射,前缀和为0时的出现次数为1
    mp.set(0, 1);
    // 初始化计数器,记录满足条件的子数组数量
    let count = 0;
    // 初始化前缀和
    let pre = 0;
    // 遍历数组中的每一个元素
    for (const x of nums) {
        // 更新当前的前缀和
        pre += x;
        // 检查当前前缀和减去k的值是否存在于映射中
        // 如果存在,说明找到了对应的子数组
        if (mp.has(pre - k)) {
            // 将找到的子数组数量加到计数器中
            count += mp.get(pre - k);
        }
        // 检查当前前缀和是否已经存在于映射中
        if (mp.has(pre)) {
            // 如果存在,增加当前前缀和的出现次数
            mp.set(pre, mp.get(pre) + 1);
        } else {
            // 如果不存在,初始化当前前缀和的出现次数为1
            mp.set(pre, 1);
        }
    }
    // 返回满足条件的子数组数量
    return count;
};

标签:pre,前缀,nums,560,元素,mp,数组
From: https://www.cnblogs.com/lushuang55/p/18512354

相关文章

  • c语言-数组队列-学习笔记
    数组队列#include<stdio.h>#include<stdlib.h>/*数组顺序队列*/typedefstructSqQueue{ intdata[10]; intfront; intrear;}SqQueue;voidInitQueue(SqQueue*Q){ Q->front=Q->rear=0;}voidEnQueue(SqQueue*Q,inta){ Q->data[Q->rear......
  • NumPy掩码数组(Masked Arrays)教程
    简介在处理数据时,我们经常会遇到缺失或无效的数据条目。如果想在不删除这些数据的情况下跳过或标记它们,可能需要使用条件语句或过滤数据。NumPy的numpy.ma模块提供了掩码数组(maskedarrays)功能,可以更方便地处理这种情况。掩码数组是标准NumPyndarray和掩码(mask)的......
  • 《Kadane‘s Algorithm专题:最大和连续子数组》
    ......
  • 209. 长度最小的子数组
    给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的子数组[numsl,numsl+1,...,numsr-1,numsr],并返回其长度。如果不存在符合条件的子数组,返回0。示例1:输入:target=7,nums=[2,3,1,2,4,3]输出:2解释:子数组......
  • Go入门指南-7.6字符串、数组和切片的应用
    7.6.1从字符串生成字节切片假设s是一个字符串(本质上是一个字节数组),那么就可以直接通过c:=[]byte(s)来获取一个字节数组的切片c。另外,您还可以通过copy函数来达到相同的目的:copy(dst[]byte,srcstring)。同样的,还可以使用for-range来获得每个元素(Listing7.1......
  • react数组插入
    1、定义数组:const[items,setItems]=useState([]);2、普通js写法插入:setItems([...items,newItem])但是由于react是异步渲染的,这种更新方式可能会导致渲染不同步3、推荐更新方式:使用setState方法,并提供一个函数,该函数接收先前的状态,并返回一个更新后的状态。constaddIte......
  • JS分隔换行成数组+去重
    代码:varmDPS="";if(multipleDispatchID!=''){constarr=multipleDispatchID.split(/[(\r\n)\r\n]+/);constarr1=Unique(arr)for(vari=0;i<arr1.length;i++){......
  • 【从零开始的LeetCode-算法】713. 乘积小于 K 的子数组
    给你一个整数数组nums和一个整数k,请你返回子数组内所有元素的乘积严格小于k的连续子数组的数目。示例1:输入:nums=[10,5,2,6],k=100输出:8解释:8个乘积小于100的子数组分别为:[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。需要注意的是[10,5,2]并不......
  • 代码随想录算法训练营day27| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃
    学习资料:https://programmercarl.com/0122.买卖股票的最佳时机II.html#算法公开课贪心PART2学习记录:122.买卖股票的最佳时间2(求最大利润,贪心:把所有正数相加;后一天与当天的股票价格差值,若为正就加入利润,若为负,则不加)点击查看代码classSolution:defmaxProfit(self,pr......
  • 数组指针的相关知识
    1.数组指针的概念    1.顾名思义,数组指针就是指向数组的指针(地址),要和指针数组做区分。    数组指针:类型为int(*)[常量],是一个地址。    指针数组:是由int*类型之类的指针为元素的数组,是一个数组。    2.数组指针指向的是整一个数组,而非......