从零学算法560

560. 和为 K 的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2

  • 比较容易想到的是暴力解法(我承认我想不到)。为了不遗漏的得到每个连续子数组的和,即为了得到所有 nums 中下标范围为 i~j 的区间的和(0<i<=j<nums.length ),直接双重遍历即可。
  •   public int subarraySum(int[] nums, int k) {int count = 0;// i 为起点,遍历 j 时得到以 i 为起点的每个连续子数组的和// i 遍历了整个数组也就是说每个点作为起点的连续子数组都试过了,所以没有遗漏的情况// 比如 nums 为 [1,2,3]// sum 尝试了 1,1+2,1+2+3// 然后尝试了 2,2+3// 最后尝试了 3(我还是不理解我为什么想不到暴力解法)for (int i = 0; i < nums.length; i++) {int sum = 0;for (int j = i; j< nums.length; j++) {sum += nums[j];if (sum == k) {count++;}}}return count;}
    
  • 使用前缀和+哈希表优化,前缀和的思想其实早就学过。比如数列前两项的和 S2 为 n1+n2,前四项的和 S4 为 n1+n2+n3+n4,如果问你 n3+n4 为多少,你可以发现就是 S4-S2,即 ni+…nj = Si-S(j-1)。
  • 前缀和就是用一个数组 s,s[n] 保存了数组 nums 前 n-1 位的和,比如 nums 为 [1,2,3],s[3] 保存了 nums 的前两位的和即为 1+2=3。如果让你求 s[4] 你只需要 s[3] + nums[2] 即可。插一嘴得到前缀和数组的公式:
  •   int[] s = new int[nums.length+1];// 正常来说应该是 s[i] = s[i-1] + nums[i] // 但是数组下标从 0 开始for(int i=0;i<nums.length;i++){s[i+1] = s[i]+nums[i]}
    
  • 首先再解读一下题目,题目要求可以理解为 ni+…+nj = k ,这样的 i 和 j 有几对?。而暴力解法的短处在于,先遍历 i 视为当前 i 已确定,此时再加一重遍历,视为 j 也确定,然后遍历 j 时就能不断得到 ni+..+nj, ni+...+n(j+1)...,然后统计遍历过程中有几个和等于 k 即可。但是现在有了前缀和数组,就当做数列和 S 好了,你会发现,既然我们要求 ni+…+nj,那么遍历前缀和数组时,其实就相当于确定了 j,也就是说此时我们得到的是 Sj,而 k = ni+..+nj = Sj - S(i-1) 也就是说只要存在 S(i-1) = Sj - k,那么这样的 i 有几个就表示 ni+…+nj = k 这样的 i 和 j 有几对,或者说当 j 确定时,也就是 Sj 确定时,等于 Sj - k 的前缀和有几个就表示 ni+…+nj = k 这样的 i 和 j 有几对。(比如当前前缀和为 5,k 为 2,那 5 前面有几个前缀和等于 3 就表示我能得到几个 2 了,反证一下,比如 n1+n2+n3+n4 = 5, n1+n2 = 3,那么就有 n3+n4 这样的连续和为 2)为了记录某个前缀和有几对,我们自然很容易想到用哈希表。
  •   public int subarraySum(int[] nums, int k) {if (nums.length == 0) {return 0;}// key:前缀和,value:出现次数HashMap<Integer,Integer> map = new HashMap<>();//细节,这里需要预存前缀和为 0 的情况,否则会漏掉前几位就满足的情况// 也就是会漏掉 Sj=k ,即 n1+..+nj 恰好等于 k 的情况// 因为这样的 n1+..+nj 虽然等于 k 但是没有 S0 给你减,那么我们就默认 n0=0,S0=0,// 减个 0 就不会对你的结果有任何影响了,所以需要map.put(0,1),垫下底map.put(0, 1);int count = 0;int presum = 0;// 既然是不断确定 Sj 然后往前找有几个对应的 S(i-1),那么没必要先求出前缀和数组再遍历// 更新 presum 的过程实际上就是遍历前缀和数组确定 j 的过程for (int x : nums) {presum += x;// 当前前缀和已知,判断是否含有 presum - k的前缀和,那么我们就知道某一区间的和为 k 了。// 比如 i 为 4,当前前缀和 S4 为 n1+n2+n3+n4 = presum ,如果有一个前缀和为 presum - k,// 比如 S2 和为 presum - k,即 n1+n2 = presum - k,那么 S4-S2 = presum - (presum - k) = k ,// 也就是说存在区间为 n3+n4 = kif (map.containsKey(presum - k)) {count += map.get(presum - k);//获取次数}//更新map.put(presum,map.getOrDefault(presum,0) + 1);}return count;}

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

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

相关文章

SQLite Studio 连接 SQLite数据库

1、在SQLite中创建数据库和表 1.1、按WINR&#xff0c;打开控制台&#xff0c;然后把指引到我们的SQLite的安装路径&#xff0c;输入D:&#xff0c;切换到D盘&#xff0c;cd 地址&#xff0c;切换到具体文件夹&#xff0c;输入“sqlite3”&#xff0c;启动服务 1.2、创建数据库…

多租户分缓存处理

多租户redis缓存分租户处理 那么数据库方面已经做到了拦截&#xff0c;但是缓存还是没有分租户&#xff0c;还是通通一个文件夹里&#xff0c; 想实现上图效果&#xff0c;global文件夹里存的是公共缓存。 首先&#xff0c;那么就要规定一个俗称&#xff0c;缓存名字带有globa…

数据库应用:MySQL MHA高可用集群

目录 一、理论 1.MHA 2.MySQL MHA部署准备 3.MySQL MHA部署 二、实验 1.MHA部署 三、问题 1.中英文符兼容报错 2.MHA测试 ssh 无密码认证语法报错 3.MHA测试 ssh 无密码认证log-bin报错 4.MHA测试 mysql 主从连接情况报错slave replication 5.MHA测试 mysql 主从连…

Elasticsearch监控工具Cerebro安装

Elasticsearch监控工具Cerebro安装 1、在windwos下的安装 1.1 下载安装包 https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip 1.2 解压 1.3 修改配置文件 如果需要修改相关信息&#xff0c;编辑C:\zsxsoftware\cerebro-0.9.4\conf\applica…

腾讯云大数据型CVM服务器实例D3和D2处理器CPU型号说明

腾讯云服务器CVM大数据型D3和D2处理器型号&#xff0c;大数据型D3云服务器CPU采用2.5GHz Intel Xeon Cascade Lake 处理器&#xff0c;大数据型D2云服务器CPU采用2.4GHz Intel Xeon Skylake 6148 处理器。腾讯云服务器网分享云服务器CVM大数据型CPU型号、处理器主频性能&#x…

css3的filter图片滤镜使用

业务介绍 默认&#xff1a;第一个图标为选中状态&#xff0c;其他三个图标事未选中状态 样式&#xff1a;选中状态是深蓝&#xff0c;未选中状体是浅蓝 交互&#xff1a;鼠标放上去选中&#xff0c;其他未选中&#xff0c;鼠标离开时候保持当前选中状态 实现&#xff1a;目前…

算法练习(3):牛客在线编程04 堆/栈/队列

package jz.bm;import java.util.*;public class bm4 {/*** BM42 用两个栈实现队列*/Stack<Integer> stack1 new Stack<>();Stack<Integer> stack2 new Stack<>();public void push(int node) {stack1.push(node);}public int pop() {while (!stack1…

Component template should contain exactly one root element

在vue中报错&#xff1a; Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead报错的大致意思是&#xff1a;组件的模板应该只能包含一个根元素&#xff0c;也就是是说作为元素的直…

【每日一题】—— C - (K+1)-th Largest Number (AtCoder Beginner Contest 273)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

【计算机网络 01】说在前面 信息服务 因特网 ISP RFC技术文档 边缘与核心 交换方式 定义与分类 网络性能指标 计算机网络体系结构 章节小结

第一章--概述 说在前面1.1 计算机网络 信息时代作用1.2 因特网概述1.3 三种交换方式1.4 计算机网络 定义与分类1.5 计算机网络的性能指标1.6 计算机网络体系结构1 常见的计算机网络体系结构2 计算机网络体系结构分层的必要性3 计算机网络体系结构分层思想举例4 计算机网络体系结…

理解JavaScript 的发布者/订阅者模式

什么是发布者/订阅者模式 发布者-订阅者模式是一种软件设计模式&#xff0c;用于实现对象之间的一对多依赖关系。在这种模式中&#xff0c;一个对象&#xff08;被称为发布者&#xff09;而其他对象&#xff08;成为订阅者&#xff09;可以在发布者上注册自己&#xff0c;以接…

本地文件夹上传到Github

本地文件夹上传到Github 步骤1. 下载git步骤2. 在github中新建一个库&#xff08;Repository&#xff09;步骤3. 设置SSH key步骤4. 添加SSH keys步骤5. 本地文件上传到github参考 步骤1. 下载git 下载git客户端&#xff0c;并在本地安装完成。 步骤2. 在github中新建一个库&a…

Install Ansible on CentOS 8

环境准备&#xff1a; 1.至少俩台linux主机&#xff0c;一台是控制节点&#xff0c;一台是受控节点 2.控制节点和受控节点都需要安装Python36 3.控制节点需要安装ansible 4.控制节点需要获得受控节点的普通用户或root用户的权限&#xff0c;控制节点需要ssh客户端&#xff0c;…

HTTPS工作原理

先简述一下什么是HTTPS&#xff0c;HTTPS就是在HTTP的基础上增加了SSL/TLS来完成加密传输&#xff0c;以免敏感信息被第三方获取&#xff0c;所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。 一、客户端发起HTTPS请求 这个没什么好说的&#xff0c;就是…

windows和linux中查找文档中的特定字符

一、windows上&#xff0c;使用find命令。 语法&#xff1a;findstr [参数] [字符串] [磁盘&#xff1a;[目录]文件] findstr [/v] [/n] [/i] [/offline] “string” [[drive:][path]filename[ …]] 参数说明&#xff1a; /b 如果位于行的开头则匹配模式。 /e …

lil_matrix()

看代码的时候遇到的&#xff0c;简单记录记录一下。 这是一种用于逐步构建稀疏矩阵的结构&#xff08;官方文档中写的&#xff09;&#xff0c;换句话说这是一种存储稀疏矩阵的方式。该稀疏矩阵通过两个list存储&#xff1a; rows [list([ ]) list([ ]) list([ ]) ... list(…

【C#】类的赋值是引用

在C#中&#xff0c;类的赋值是将一个类的实例赋给另一个类的实例或者将一个类的实例赋给一个变量。 例如&#xff0c;假设有一个名为Person的类&#xff1a; csharp public class Person { public string Name { get; set; } public int Age { get; set; } } 然后可以创建两个…

[JavaScript游戏开发] 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测

系列文章目录 第一章 2D二维地图绘制、人物移动、障碍检测 第二章 跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示) 第三章 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测 文章目录 系列文章目录前言一、本章节效果图二、介绍2.1、准备地图素材2.2、封装地图上…

[OnWork.Tools]系列 01-简介

说明 OnWork.Tools 是基于 Net6 的桌面程序。支持Windows7SP1及以上系统&#xff0c;主要是日常办公或者是开发工作过程中常用的工具集合。界面使用WPF Mvvm模式开发&#xff0c;目的是将开源项目中&#xff0c;好用的项目集成到一起&#xff0c;方便大家使用和学习。 功能 …

React:从 npx开始

使用 npm 来创建第一个 recat 文件&#xff08; react-demo 是文件名&#xff0c;可以自定义&#xff09; npx create-react-app react-demo npx是 npm v5.2 版本新添加的命令&#xff0c;用来简化 npm 中工具包的使用 原始&#xff1a; 全局安装npm i -g create-react-app 2 …