LintCode第1712题 - 和相同的二元子数组

描述

在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组

样例 1:

输入:A = [1,0,1,0,1], S = 2
输出:4
解释:
如下面黑体所示,有 4 个满足题目要求的子数组:
[1,0,1]
[1,0,1]
[1,0,1,0]
[0,1,0,1]

样例 2:

输入:A = [0,0,0,0,0,0,1,0,0,0], S = 0
输出:27
解释:
和为 S 的子数组有 27 个

思路1 采用同向双指针法 通过暴力双指针枚举所有起点 + 滑动右指针

每轮固定左指针 left,右指针从 left 向右滑动; 每次累加和,如果等于 S,就记录这个子数组; 关键点是从每个 left 出发,向右滑,不能随便跳过任何一个组合

代码1:

public class Solution {

    public int numSubarraysWithSum(int[] A, int S) {

        int n=A.length;

        int count=0;

        for(int left = 0; left < n; left++)//同向双指针法计算是否为目前值S

        {

            int accumulatedNum = 0;

            for (int right = left; right < n; right++) {

                accumulatedNum += A[right];

                if (accumulatedNum == S) {

                    count++;

                } else if (accumulatedNum > S) {

                    break; // 再滑动右指针没意义了

                }

            }

           

        }

        return count;

    }

}

思路2 前缀和 + 哈希表

每轮固定左指针 left,右指针从 left 向右滑动; 每次累加和,如果等于 S,就记录这个子数组; 关键点是从每个 left 出发,向右滑,不能随便跳过任何一个组合

任意一个子数组 [i..j] 的和 = prefixSum[j] - prefixSum[i-1] 若要求 sum[i..j] = S,则等价于: prefixSum[j] - prefixSum[i-1] == S → prefixSum[i-1] == prefixSum[j] - S

prefixMap 来记录前缀和出现的次数,作用是:

键(Key)值(Value)
某个前缀和 x这个前缀和 x 出现过多少次

prefixMap.put(0, 1); 

前缀和为 0 出现了 1 次(这是初始化)

它允许我们从下标 0 开始的子数组也能被统计进来

accumulatedNum 当前前缀和,也就是从 A[0] 到 A[i] 的累加值

count 当前找到的子数组个数,最终返回这个值

步骤 1:累加前缀和 

accumulatedNum += A[i]; // 累加前缀和 将当前元素 A[i] 累加到 accumulatedNum 中; accumulatedNum 代表前缀和 prefixSum[i]

每次比较都是当前前缀和-s 当有

既等式

prefixSum[j] - prefixSum[i-1] == S
prefixSum[i-1] == prefixSum[j] - S
accumulatedNum - S

是我们想找的值 意思为在前面的位置出现过这样一个前缀和,
这样从那个位置之后到我当前位置,就刚好是一个和为 S 的子数组

prefixMap.get(accumulatedNum - S)之前有多少个位置,它们的前缀和等于 accumulatedNum - S

每一个都可以作为「合法子数组的起点」,从那个点到当前 i 的子数组和为 S
所以:prefixMap.get(accumulatedNum - S) 就是当前命中的合法子数组个数

prefixMap.put(accumulatedNum, prefixMap.getOrDefault(accumulatedNum, 0) + 1);
把当前的前缀和 accumulatedNum 的出现次数 +1

因为我们要统计「从前面某个位置 i 到当前位置 j 的和为 S 的子数组数量」。

每一个前缀和,都可能为后面提供组合,所以我们必须记录它出现的次数

import java.util.*;

public class Solution {
    public int numSubarraysWithSum(int[] A, int S) {
        int accumulatedNum = 0; // 当前的前缀和
        int count = 0;

        Map<Integer, Integer> prefixMap = new HashMap<>();
        prefixMap.put(0, 1); // 初始化:前缀和为 0 出现了 1 次

        for (int i = 0; i < A.length; i++) {
            accumulatedNum += A[i]; // 累加当前前缀和

            // 如果之前出现过 accumulatedNum - S,就说明找到了满足条件的子数组
            if (prefixMap.containsKey(accumulatedNum - S)) {
                count += prefixMap.get(accumulatedNum - S);
            }

            // 更新当前前缀和出现次数
            prefixMap.put(accumulatedNum, prefixMap.getOrDefault(accumulatedNum, 0) + 1);
        }

        return count;
    }
}   

一个疑问点是如果不写

那么就会漏掉那些从 index = 0 开始就满足和为 S 的子数组

例 A = [1, 0, 1], S = 2

有 prefixMap.put(0, 1) 的时候:

iA[i]accumulatedNumaccumulatedNum - SprefixMap命中count
011-10
101-10
21201

最终结果: 找到了子数组 [0, 1, 2],和为 2。

当prefixMap.put(0, 1)没有的时候 

当前累计为 2 的时候,你想找的前缀和是 0,但 prefixMap 里没有

prefixMap.getOrDefault(accumulatedNum, 0) 会取下标为0的值 因为没有放入1 则

这段合法子数组 [1, 0, 1] 就不会被统计 即错误结果 最终结果是:count=0

推荐刚开始学习使用双指针法 进阶使用前缀和 + 哈希表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL笔记】库操作与表操作

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;MySQL &#x1f339;往期回顾&#x1f339;&#xff1a;【MySQL】认识MySQL &#x1f516;流水不争&#xff0c;争的是滔滔不 一、库操作1.1 显示数据库1.2 创建数据库…

SpringBoot3实战(SpringBoot3+Vue3基本增删改查、前后端通信交互、配置后端跨域请求、数据批量删除(超详细))(3)

目录 一、从0快速搭建SpringBoot3工程、SpringBoot3集成MyBatis、PageHelper分页查询的详细教程。(博客链接) 二、实现前端与后端通信对接数据。(axios工具) &#xff08;1&#xff09;安装axios。(vue工程目录) &#xff08;2&#xff09;封装请求工具类。(request.js) <1&…

单播、广播、组播和任播

文章目录 一、单播二、广播三、组播四、任播代码示例&#xff1a; 五、各种播的比较 一、单播 单播&#xff08;Unicast&#xff09;是一种网络通信方式&#xff0c;它指的是在网络中从一个源节点到一个单一目标节点对的传输模式。单播传输时&#xff0c;数据包从发送端直接发…

【实战】deepseek数据分类用户评论数据

在平时的工作中&#xff0c;我们会遇到数据分类的情况&#xff0c;比如将一些文本划分为各个标签。如果人工分类这块的工作量将是非常大&#xff0c;而且分类数据的准确性也不高。我们需要用到一些工具来实现。提高效率的同时也提高准确率。 1.示例数据 用户ID 时间戳 评论场…

技术视角解读:游戏出海如何借助AWS全球架构突破性能与合规瓶颈

【场景痛点】 某二次元卡牌手游团队在东南亚市场遭遇联机延迟投诉率高达37%&#xff0c;日本地区因数据合规问题面临下架风险。在传统IDC架构下&#xff0c;运维团队需要同时管理3个区域的物理服务器&#xff0c;版本更新耗时长达6小时。 【技术架构升级】 通过AWS Local Zones…

【JavaEE】网络编程socket

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

第16届蓝桥杯单片机4T模拟赛三

本次模拟赛涉及的模块&#xff1a;基础三件套&#xff08;Led&Relay&#xff0c;按键、数码管&#xff09; 进阶单件套&#xff08;pcf8591的AD模块&#xff09; 附件&#xff1a; 各模块底层代码在文章的结尾 一、数码管部分 1.页面1 页面1要显示的格式是&#xff1a; …

网络华为HCIA+HCIP IPv6

目录 IPv4现状 IPv6基本报头 IPv6扩展报头 IPv6地址 IPv6地址缩写规范 ​编辑 IPv6地址分配 IPv6单播地址分配 IPv6单播地址接口标识 IPv6常见单播地址 - GUA &#xff08;2 / 3 开头&#xff09; IPv6常见单播地址 - ULA IPv6常见单播地址 - LLA IPv6组播地…

基于YOLOv8深度学习的智能小麦害虫检测识别系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

Mac:Maven 下载+安装+环境配置(详细讲解)

&#x1f4cc; 下载 Maven 下载地址&#xff1a;https://maven.apache.org/download.cgi &#x1f4cc; 无需安装 Apache官网下载 Maven 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目录下新建…

XSS-labs(反射型XSS) 靶场 1-13关 通关

目录 前言 XSS漏洞概述 XSS漏洞分类 通关日记 level1 分析 解题 ​level2 分析 解题 方法一&#xff1a;闭合标签 方法二&#xff1a;闭合双引号 level3 分析 解题 level4 分析 解题 level5 分析 解题 level6 分析 解题 level7 分析 解体 level8 …

GPT-5 将免费向所有用户开放?

GPT-5 将免费向所有用户开放&#xff1f; 硅谷知名分析师 Ben Thompson 最近与 OpenAI CEO Sam Altman 进行了一场深度对谈&#xff0c;其中Sam Altman透漏GPT-5将免费向大家发放。 OpenAI 这波操作可不是一时冲动&#xff0c;而是被逼出来的。DeepSeek 这个新秀横空出世&am…

【杂记二】git, github, vscode等

一、前言 暂时空着... 二、git 2.1 可能的疑问 1. VSCode 项目名和 GitHub 仓库名是否需要一致&#xff1f; 不需要一致。 VSCode 项目名&#xff08;也就是你本地的文件夹名字&#xff09;和 GitHub 仓库名可以不一样。 Git 是一个分布式版本控制系统&#xff0c;它主要关…

数学爱好者写的编程系列文章

作为一个数学爱好者&#xff0c;我大学读的专业却不是数学专业&#xff0c;而是跟计算机有关的专业。原本我对编程一窍不通&#xff0c;平时上课也是在看数学文献&#xff0c;作业基本靠同学&#xff0c;考试及格就行。不过后来因为毕业的压力&#xff0c;我还是拥抱编程了&…

FPGA 以太网通信(四)网络视频传输系统

一、网络视频传输系统 网络视频传输系统使用ov5640摄像头采集数据&#xff0c;通过组件UDP帧将视频数据实时传输给上位机。 ov5640视频传输带宽 像素分辨率设为640x480&#xff0c;帧率设为60帧&#xff0c;像素格式为RGB565&#xff0c;传输带宽为 640 x 480 x 16bit x 60 fps…

[leetcode]1631. 最小体力消耗路径(bool类型dfs+二分答案/记忆化剪枝/并查集Kruskal思想)

题目链接 题意 给定 n m n\times m nm地图 要从(1,1) 走到 (n,m) 定义高度绝对差为四联通意义下相邻的两个点高度的绝对值之差 定义路径的体力值为整条路径上 所有高度绝对差的max 求所有路径中 最小的路径体力值是多少 方法1 这是我一开始自己写的记忆化剪枝 比较暴力 时…

DeepSeek写打台球手机小游戏

DeepSeek写打台球手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端打台球小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 有白球和其他颜色的球&am…

webpack使用详细步骤

项目描述 本项目 webpack 的基本使用。 webpack 官方&#xff1a;https://webpack.docschina.org/concepts/ Element-plus 官方&#xff1a;https://element-plus.sxtxhy.com/zh-CN/ Vue3 官方&#xff1a;https://cn.vuejs.org/ 项目组成明细 每个步骤完成后重新执行 npm run …

【STM32实物】基于STM32的太阳能充电宝设计

基于STM32的太阳能充电宝设计 演示视频: 基于STM32的太阳能充电宝设计 硬件组成: 系统硬件包括主控 STM32F103C8T6、0.96 OLED 显示屏、蜂鸣器、电源自锁开关、温度传感器 DS18B20、继电器、5 V DC 升压模块 、TB4056、18650锂电池、9 V太阳能板、稳压降压 5 V三极管。 功能…

【记一次】AI微调训练步数计算方式

llama微调训练步数计算方式,以下数据为假设 一、关键参数解析 总样本数&#xff1a;Num examples 1,047 表示训练数据集包含 1,047 个样本。 训练轮数&#xff1a;Num Epochs 300 表示整个训练集将被遍历 300 次。 总批次大小&#xff1a;Total train batch size 80 表示…