【算法】【优选算法】前缀和(下)

目录

  • 一、560.和为K的⼦数组
    • 1.1 前缀和
    • 1.2 暴力枚举
  • 二、974.和可被K整除的⼦数组
    • 2.1 前缀和
    • 2.2 暴力枚举
  • 三、525.连续数组
    • 3.1 前缀和
    • 3.2 暴力枚举
  • 四、1314.矩阵区域和
    • 4.1 前缀和
    • 4.2 暴力枚举

一、560.和为K的⼦数组

题目链接:560.和为K的⼦数组
题目描述:

题目解析:

  • 求数组中子串的和为k的个数。

1.1 前缀和

解题思路:

  • 假设已经创建好了一个前缀和数组dp,我们使用前缀和的时候,判断从0到 i 位置的和为k的子数组个数,只需要在dp下标[ 0 , i - 1 ]中找dp元素值为dp[ i ] - k的个数即可。
  • 所以我们使用一个容器hash表来存储从0 到 i - 1的前缀和的个数,关键字key就是前缀和,values就是次数。
  • 细节处理:
    • 我们不需要真的使用前缀和数组,只需要遍历原数组时,用一个变量记录遍历过的元素和即可。
    • 当该前缀和就是k的时候,我们上面条件没有考虑,所以我们还要先放入(0,1)表示这种情况。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {public int subarraySum(int[] nums, int k) {Map<Integer,Integer> hash = new HashMap<>();hash.put(0,1);int sum = 0;int ret = 0;for(int i = 0; i < nums.length; i++) {sum += nums[i];ret += hash.getOrDefault(sum-k,0);hash.put(sum, hash.getOrDefault(sum,0)+1);}return ret;}
}

1.2 暴力枚举

解题思路:

  • 直接使用两层for循环,将每一种可能枚举出来。

解题代码:

//时间复杂度:O(n^2)
//空间复杂度:O(1)
class Solution {public int subarraySum(int[] nums, int k) {int ret = 0;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) {ret++;}}}return ret;}
}

二、974.和可被K整除的⼦数组

题目链接:974.和可被K整除的⼦数组
题目描述:

题目解析:

  • 跟上一道题一样的思路,只不过这个是求能被整除的个数而已。

2.1 前缀和

解题思路:

  • 同余定理:如果(a - b)% p == 0 那么a % p 和b % p值相等。
  • Java中负数对正数取余修正:在Java中负数对正数取余余数会是负数,修正方法就是:(a % p + p)% p
  • 使用hash表将i下标前的每一个前缀和与k的余数存入。
  • 再看前面前缀和与当前 前缀和的余数相同的个数即可。
  • 当[0 , i]本身前缀和余数为0的时候,就是一个符合条件的子数组。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {public int subarraysDivByK(int[] nums, int k) {int ret = 0;Map<Integer,Integer> hash = new HashMap<>();hash.put(0 % k , 1);int sum = 0;for(int x : nums) {sum += x;int key = (sum % k + k ) % k;ret += hash.getOrDefault(key,0);hash.put(key, hash.getOrDefault(key , 0) + 1);}return ret;}
}

2.2 暴力枚举

解题思路:

  • 直接遍历数组,在将遍历元素的和取余即可。
  • 会超时。

解题代码:

//时间复杂度:O(n^2)
//空间复杂度:O(1)
class Solution {public int subarraysDivByK(int[] nums, int k) {int ret = 0;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 + k) % k == 0) ret++;}}return ret;}
}

三、525.连续数组

题目链接:525.连续数组
题目描述:

题目解析:

  • 要我们返回子数组中 0 和1 数量相等的最长子数组的长度。

3.1 前缀和

解题思路:

  • 我们使用一个容器hash表,关键字key来记录原数组每个下标i中的1与0个数差,而values记录这个差值的最小下标。
  • 注意边界情况,如果刚好整个数组满足条件,结果就是数组长 又等于nums.length-1 + 1所以我们初始一个(0,-1)
  • 求长度的时候,我们在前面找到 j 下标与现在 i 下标关键字一样,那么数组区间就是[ j+1 , i ]

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {public int findMaxLength(int[] nums) {int ret = 0;int n = nums.length;Map<Integer,Integer> hash = new HashMap<>();hash.put(0,-1);//前面1和0个数之差int num = 0;for(int i = 0; i < n; i++) {if(nums[i] == 0) num--;else num++;if(hash.containsKey(num)) ret = Math.max(ret, i - hash.get(num));else hash.put(num, i);}return ret;}
}

3.2 暴力枚举

解题思路:

  • 两层for循环遍历数组,记录每一个子数组中1和0的个数,
  • 当个数相同的时候,更新结果。
  • 会超时

解题代码:

//时间复杂度:O(n^2)
//空间复杂度:O(1)
class Solution {public int findMaxLength(int[] nums) {int ret = 0;for(int i = 0; i < nums.length; i++) {int oneNum = 0;int zeroNum = 0;for(int j  = i; j < nums.length; j++) {if(nums[j] == 0) zeroNum++;else oneNum++;if(oneNum == zeroNum) ret = Math.max(ret,j-i+1);}}return ret;}
}

四、1314.矩阵区域和

题目链接:1314.矩阵区域和
题目描述:

题目解析:

  • 给一个二维数组,给一个k,返回的二维结果数组中数组( i , j )下标的值是原数组( i-k , j-k )到( i+k , j+k)的和。
  • 就像下图中红方框框起来的:

4.1 前缀和

解题思路:

  • 其实着就是前缀和上篇中给出的二维前缀和模版。
  • 我们使用一个二维数组dp比原来数组多一行一列,dp[ i ][ j ]就是原数组中(0 , 0)到(i - 1 , j -1)的元素和。
  • dp[ i ][ j ] = dp[ i - 1][j - 1] + nums[ i - 1][j - 1]。
  • 在结果数组中与原数组大小一样,本来是求原数组( i-k , j-k )到( i+k , j+k)的和。那么对应到dp数组中,都要加1。
  • 注意越界,如果( i-k , j-k )小于0那么就是0,i+k大于原数组行数,那么就是原数组行数,j+k大于原数组列数,那么就是原数组列数。

解题代码:

//时间复杂度:O(n^2)
//空间复杂度:O(n^2)
class Solution {public int[][] matrixBlockSum(int[][] mat, int k) {int n = mat.length;int m = mat[0].length;int[][] dp = new int[n+1][m+1];dp[0][0] = mat[0][0];for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + mat[i-1][j-1];}    } int[][] ret = new int[n][m]; for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {int x2 = i+k > n-1 ? n-1 : i+k;int y2 = j+k > m-1 ? m-1 : j+k;int x1 = i-k < 0 ? 0 : i-k;int y1 = j-k < 0 ? 0 : j-k;ret[i][j] = dp[x2+1][y2+1] - dp[x2+1][y1-1+1] - dp[x1-1+1][y2+1]+dp[x1-1+1][y1-1+1];}}return ret;}
}

4.2 暴力枚举

解题思路:

  • 先两层for循环,拿到结果数组行列,
  • 再两层for循环,求原数组( i-k , j-k )到( i+k , j+k)的和。

解题代码:

//时间复杂度:O(n^4)
//空间复杂度:O(1)
class Solution {public int[][] matrixBlockSum(int[][] mat, int k) {int n = mat.length;int m = mat[0].length;int[][] ret = new int[n][m];for(int i = 0; i < n; i++) {for(int j = 0; j < m; j++) {int x2 = i+k > n-1 ? n-1 : i+k;int y2 = j+k > m-1 ? m-1 : j+k;int x1 = i-k < 0 ? 0 : i-k;int y1 = j-k < 0 ? 0 : j-k;for(int w = x1; w <= x2; w++) {for(int q = y1; q <= y2; q++) {ret[i][j] += mat[w][q];}}}}return ret;}
}

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

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

相关文章

分布式cap理论学习

【分布式】CAP理论详解 一致性(Consistency) 代表数据在任何时刻&#xff0c;任何分布式节点&#xff0c;看到的都是符合预期的。有点类似于幂等&#xff0c;无论访问哪个节点&#xff0c;得到结果数据一致。 可用性(Availability) 强调的是任意时刻一定能读到数据&#xff…

主机型入侵检测系统(HIDS)——Elkeid在Centos7的保姆级安装部署教程

一、HIDS简介 主机型入侵检测系统(Host-based Intrusion Detection System 简称:HIDS);HIDS作为主机的监视器和分析器,主要是专注于主机系统内部(监视系统全部或部分的动态的行为以及整个系统的状态)。 HIDS使用传统的C/S架构,只需要在监测端安装agent即可,且使用用户…

Python蓝桥杯刷题1

1.确定字符串是否包含唯一字符 题解&#xff1a;调用count函数计算每一个字符出现的次数&#xff0c;如果不等于1就输出no&#xff0c;并且结束循环&#xff0c;如果等于1就一直循环直到计算到最后一个字符&#xff0c;若最后一个字符也满足条件&#xff0c;则输出yes import…

【ARM】MDK在debug模式下的Registers窗口包含哪些内容

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决客户对于Debug模式下&#xff0c;对于Registers窗口包含的内容了解。 2、 问题场景 Registers窗口是在进入到debug模式下后&#xff0c;就会出现一个窗口。窗口中包含了很多寄存器信息。但是对于具体内容不了解…

河道无人机雷达测流监测系统由哪几部分组成?

在现代水利管理中&#xff0c;河道无人机雷达监测系统正逐渐成为一种重要的工具&#xff0c;为河道的安全和管理提供了强大的技术支持。那么&#xff0c;这个先进的监测系统究竟由哪几部分组成呢&#xff1f; 河道无人机雷达监测系统工作原理 雷达传感器通过发射电磁波或激光束…

浅谈数据仓库的架构及其演变

一、数据仓库分层架构 数据仓库分层一般分为三层&#xff0c;分别为数据仓库ODS层&#xff08;数据进出口贴源层&#xff09;、CDM层&#xff08;数据公共层&#xff09;和ADS层&#xff08;数据应用层&#xff09;。 1. ODS层&#xff1a;这是数据仓库的最底层&#xff0c;直接…

event_base

build default event_base event_base_new()函数分配并且返回一个新的具有默认设置的event_base。函数会检测环境变量&#xff0c;返回一个到event_base的指针。如果发生错误&#xff0c;则返回NULL。选择各种方法时&#xff0c;函数会选择OS支持的最快方法。 event_base_new…

PyTorch使用教程-深度学习框架

PyTorch使用教程-深度学习框架 1. PyTorch简介 1.1-什么是PyTorch ​ PyTorch是一个广泛使用的开源机器学习框架&#xff0c;特别适合深度学习的应用。它以其动态计算图而闻名&#xff0c;允许在运行时修改模型&#xff0c;使得实验和调试更加灵活。PyTorch提供了强大的GPU加…

数据科学与SQL:如何计算排列熵?| 基于SQL实现

目录 0 引言 1 排列熵的计算原理 2 数据准备 3 问题分析 4 小结 0 引言 把“熵”应用在系统论中的信息管理方法称为熵方法。熵越大&#xff0c;说明系统越混乱&#xff0c;携带的信息越少&#xff1b;熵越小&#xff0c;说明系统越有序&#xff0c;携带的信息越多。在传感…

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…

无人机在森林中的应用!

一、森林资源调查 无人机可以利用遥感技术快速获取所需区域高精度的空间遥感信息&#xff0c;对森林图斑进行精确区划。相较于传统手段&#xff0c;无人机调查具有低成本、高效率、高时效的特点&#xff0c;尤其在地理环境条件不好的区域&#xff0c;调查人员无法或难以到达的…

esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器

MQTT介绍 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;旨在设备之间进行通信&#xff0c;尤其是在网络条件较差的情况下。MQTT v3.1.1 和 MQTT v5 是该协议的两个主要版本。 MQTT v3.1.1&#xff1a; 优点&#xff…

什么是SMARC?模块电脑(核心板)规范标准简介三

1. 概念 SMARC&#xff08;Smart Mobility ARChitecture&#xff0c;智能移动架构&#xff09;是一种通用的小型计算机模块定义&#xff0c;基于ARM和X86技术的模块化计算机低功耗嵌入式架构平台&#xff0c;旨在满足低功耗、低成本和高性能的应用需求。这些模块通常使用与平板…

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

JavaWeb——JS、Vue

目录 1.JavaScript a.概述 b.引入方式 c.JS的基础语法 d.JS函数 e.JS对象 f.JS事件监听 2.Vue a.概述 b.Vue常用指令 d.生命周期 1.JavaScript a.概述 JavaScript是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;它能使网页可交互。JavaScript和…

MySQL的编程语言

一、MySQL基础 使用系统的全局变量@@VERSION查看当前使用的MySQL的版本信息,SQL语句如下: select @@version; 将局部变量varl声明为char的类型,长度值为10,并为其赋值为“程菲” begin declare var1 char(10); set @var1="程菲"; end 通过局部变量查看d_eams数…

小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

阿里云引领智算集群网络架构的新一轮变革

阿里云引领智算集群网络架构的新一轮变革 云布道师 11 月 8 日~ 10 日在江苏张家港召开的 CCF ChinaNet&#xff08;即中国网络大会&#xff09;上&#xff0c;众多院士、教授和业界技术领袖齐聚一堂&#xff0c;畅谈网络未来的发展方向&#xff0c;聚焦智算集群网络的创新变…

【ASR技术】WhisperX安装使用

介绍 WhisperX 是一个开源的自动语音识别&#xff08;ASR&#xff09;项目&#xff0c;由 m-bain 开发。该项目基于 OpenAI 的 Whisper 模型&#xff0c;通过引入批量推理、强制音素对齐和语音活动检测等技术。提供快速自动语音识别&#xff08;large-v2 为 70 倍实时&#xf…

android framework ams/wms常见系统日志(main\system\events\crash,protoLog使用)

重要性 wms和ams的一些系统原生日志能够帮助我们快速定位问题 日志分类 在日常framework工作中常见的日志类别如下&#xff1a; -b , --buffer Request alternate ring buffer, ‘main’, ‘system’, ‘radio’, ‘events’, ‘crash’, ‘default’ or ‘all’. Additiona…