[LC 总结] 前缀和(Prefix Sum)总结 10 道相关练习题

news/2023/11/28 17:57:33

[LC 总结] 前缀和(Prefix Sum)总结& 10 道相关练习题

类型与题目列表如下:

在这里插入图片描述

题目的解法都做过了,会留在最后一个部分,接下来就梳理一下 prefix sum,列举的题目从简单到 -> 困难

基础

prefix sum 其本身是一个数组相关的数据类型,它的实现方法也非常的简单,以存在数组 nums 为例,就是使用另外一个数组,保存 ∑ k = i i n u m s [ k ] \sum_{k=i}^{i} nums[k] k=iinums[k] 的值,以 [1, 2, 3, 4, 5] 为例,对应的 prefix sum 为 [1, 3, 6, 10, 15][0, 1, 3, 6, 10, 15]

prefix sum 的走向为 0 -> len(nums),如果是走向为 len(nums) -> 0,那么这个被称之为 suffix sum,或是 postfix sum,以 [1, 2, 3, 4, 5] 来说,它所对应的 suffix sum 为 [15, 14, 12, 9, 5][15, 14, 12, 9, 5, 0]

prefix sum(包含 suffix sum)的优点在于,在已经构筑 prefix sum 后,寻找任意下标所耗费的时间为 O ( 1 ) O(1) O(1)。换言之,如果给定任意 i i i,寻找 i + k i + k i+k 的子数组之和只需要花费 O ( 1 ) O(1) O(1) 的时间,其实现方法为 p r e f i x _ s u m [ i + k ] − p r e f i x _ s u m [ i − 1 ] prefix\_sum[i + k] - prefix\_sum[i - 1] prefix_sum[i+k]prefix_sum[i1],如:

在这里插入图片描述

也因为这个特性,prefix sum 又可以被使用 hash map 的结构去实现。

除此之外,对 prefix array 进行其他的操作——如求平均值、最大、最小——均可以被视作 prefix sum 的变种题

prefix

仅用 prefix 一个技巧的题目有点少,1343 是一个案例:

Given an array of integers arr and two integers k and threshold, return the number of sub-arrays of size k and average greater than or equal to threshold.

这个题目的 prefix sum 解法可以用 p r e f i x _ s u m [ i + k ] − p r e f i x _ s u m [ i − 1 ] prefix\_sum[i + k] - prefix\_sum[i - 1] prefix_sum[i+k]prefix_sum[i1] 去找到长度为 k 的子数组之和,随后看看是不是满足条件(平均数 >= threshold)即可

对比仅用单一的 prefix sum 技巧的话,其实 sliding window 更方便一些……毕竟长度是固定的

prefix + suffix

这里面我做过的有 2909,2874,238 和 2102,题目分别如下:

2874:

You are given a 0-indexed integer array nums.

Return the maximum value over all triplets of indices (i, j, k) such that i < j < k. If all such triplets have a negative value, return 0.

The value of a triplet of indices (i, j, k) is equal to (nums[i] - nums[j]) * nums[k].


2909:

You are given a 0-indexed array nums of integers.

A triplet of indices (i, j, k) is a mountain if:

  • i < j < k
  • nums[i] < nums[j] and nums[k] < nums[j]

Return the minimum possible sum of a mountain triplet of nums. If no such triplet exists, return -1.


238:

Given an integer array nums, return an array answer such that answer[i] is equal to the product of all the elements of nums except nums[i].

The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.

You must write an algorithm that runs in O(n) time and without using the division operation.


2012:

You are given a 0-indexed integer array nums. For each index i (1 <= i <= nums.length - 2) the beauty of nums[i] equals:

  • 2, if nums[j] < nums[i] < nums[k], for all 0 <= j < i and for all i < k <= nums.length - 1.
  • 1, if nums[i - 1] < nums[i] < nums[i + 1], and the previous condition is not satisfied.
  • 0, if none of the previous conditions holds.
    Return the sum of beauty of all nums[i] where 1 <= i <= nums.length - 2.

其题型的主要特点就是:

  • 是一个数组
  • 数组可以分为 [ 0 , 1 , . . . , i ] [0, 1, ..., i] [0,1,...,i] [ i , i + 1 , . . . , l e n ( a r r ) ) [i, i+1, ..., len(arr)) [i,i+1,...,len(arr)) 两段去处理
  • 对所有 i i i 而言, [ 0 , 1 , . . . , i ] [0, 1, ..., i] [0,1,...,i] [ i , i + 1 , . . . , l e n ( a r r ) ) [i, i+1, ..., len(arr)) [i,i+1,...,len(arr)) 的处理方式都是一样的

这里对这四道题来说也是一样的:

  • 2874 是对 [ 0 , 1 , . . . , i ] [0, 1, ..., i] [0,1,...,i] [ i , i + 1 , . . . , l e n ( a r r ) ) [i, i+1, ..., len(arr)) [i,i+1,...,len(arr)) 求 max
  • 2909 是对 [ 0 , 1 , . . . , i ] [0, 1, ..., i] [0,1,...,i] [ i , i + 1 , . . . , l e n ( a r r ) ) [i, i+1, ..., len(arr)) [i,i+1,...,len(arr)) 求 min
  • 238 求的是 product sum
  • 2012 则是对 [ 0 , 1 , . . . , i ] [0, 1, ..., i] [0,1,...,i] 求 max,对 [ i , i + 1 , . . . , l e n ( a r r ) ) [i, i+1, ..., len(arr)) [i,i+1,...,len(arr)) 求 min

也就是说,处理这类题型的方式可以使用 prefix array 去存储 0 -> len(nums) 的处理结果,用 suffix array(可以简化成只用一个变量) 去存储 len(nums) -> 0 的处理结果,最后筛选出满足题意的结果

hashtable + prefix sum

这种类型的基础题为 560. Subarray Sum Equals K,这道题可以说是后面很多题的一个基础,其运用的技巧就在上面提到过的:如果给定任意 i i i,寻找 i + k i + k i+k 的子数组之和只需要花费 O ( 1 ) O(1) O(1) 的时间,其实现方法为 p r e f i x _ s u m [ i + k ] − p r e f i x _ s u m [ i − 1 ] prefix\_sum[i + k] - prefix\_sum[i - 1] prefix_sum[i+k]prefix_sum[i1] 这一特性

之所以使用哈希表而不是数组,则是因为哈希表中保存的为 {前缀和: 前缀和出现的次数} 这一搭配,用以比较方便的寻找满足和为 k 的组合

以 560 为例,它求的是子数组之和为 k 的排列组合,这里可以将 k 视作 p r e f i x _ s u m [ i + k ] − p r e f i x _ s u m [ i − 1 ] prefix\_sum[i + k] - prefix\_sum[i - 1] prefix_sum[i+k]prefix_sum[i1] 的结果,哈希表中又保存的是 {前缀和: 前缀和出现的次数},因此只要通过使用 当前前缀和 - k 就能够获取 p r e f i x _ s u m [ i − 1 ] prefix\_sum[i - 1] prefix_sum[i1] 出现的次数,如:

在这里插入图片描述

进阶篇

这里就是几种技巧的组合了

prefix + 2 pointers

这个在做过的题里面有两个:1343 Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold 和 1248 Count Number of Nice Subarrays,题目分别如下:

1248:

Given an array of integers nums and an integer k. A continuous subarray is called nice if there are k odd numbers on it.

Return the number of nice sub-arrays.

这两道题用双指针的解法比较直接,不过使用 hashtable 也可以,不过这里存的不是频率,而是 i i i 之前出现了多少个字符(不同的组合)

这道题我刚开始用的是双指针,不过后面看了下 prefix sum,写法比双指针简单

hashtable + prefix sum 变种

这里我做过的题目典型是 974,这里哈希表中保存的不是 prefix sum,而是 p r e f i x _ s u m % k prefix\_sum \% k prefix_sum%k,这样就能满足题目中 Subarray Sums Divisible by K 这一需求

原理就是,如果找到余数相同的子数组,自然也就意味着找到可以满足被 k 整除的子数组这一条件

hashtable + prefix + BST

这个体形本质上就是更多技巧的累积,相比较而言 BST 有些边界条件需要处理,总体上知道思路也能写出来(medium 范畴),题目为 437 Path Sum III

prefix + suffix + monotonic stack

这道题之前周赛出现的 2866 Beautiful Towers II,它的前置要求为能解 84 Largest Rectangle in Histogram,会 84 Largest Rectangle in Histogram 就是花时间磨一下 84 的题解套用 prefix+suffix 的技巧

简单的说一下就是从 [ 0 , 1 , . . . , i ] [0, 1, ..., i] [0,1,...,i] [ i , i + 1 , . . . , l e n ( a r r ) ) [i, i+1, ..., len(arr)) [i,i+1,...,len(arr)) 分别找到最大的面积,然后二者相加即可。不过这找最大面积的技巧有些的麻烦,需要使用单调栈。如果不了解单调栈的话,这道题估计挠破脑袋都很难想到答案……

不过这道题能被归类成 medium 我是真的没想到就是了

写过的题解

  • 1343 Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold
  • 2874. Maximum Value of an Ordered Triplet II & 2909. Minimum Sum of Mountain Triplets II
  • 238 Product of Array Except Self & 2012. Sum of Beauty in the Array
  • 哈希表 - 和为 K 的子数组, leetcode 560
  • 1248 Count Number of Nice Subarrays
  • 974 Subarray Sums Divisible by K
  • 437 Path Sum III
  • 2866 Beautiful Towers II
    • [python 刷题] 84 Largest Rectangle in Histogram

http://www.ppmy.cn/news/1203002.html

相关文章

第13章 Java IO流处理(一) File类

目录 内容说明 章节内容 一、 File类 内容说明 结合章节内容重点难点,会对重要知识点进行扩展,以及做示例说明等,以便更好理解重点难点 章节内容 一、 File类 1、文件与目录的描述类——File ✔️ File类并不用来进行文件的读/写操作,并未涉及到写入或读取文件内容的…

jenkins部署job

apt install fontconfig openjdk-11-jre wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.429/jenkins.wardeb包安装 wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.414.3_all.debdpkg -i jenkins_2.414.3_all.deb 访问 http://…

【文献分享】NASA JPL团队CoSTAR一大力作:直接激光雷达里程计:利用密集点云快速定位

论文题目&#xff1a;Direct LiDAR Odometry: Fast Localization With Dense Point Clouds 中文题目&#xff1a;直接激光雷达里程计:利用密集点云快速定位 作者&#xff1a;Kenny Chen, Brett T.Lopez, Ali-akbar Agha-mohammadi 论文链接&#xff1a;https://arxiv.org/pd…

Red Giant Trapcode Suite 2024.0.1

Red Giant Trapcode Suite是一款ae视觉效果插件软件&#xff0c;适用于After Effects和Premiere Pro等流行的视频编辑软件。该软件集合了一系列强大而创新的工具&#xff0c;可以帮助用户创建令人惊叹的视觉效果和动态图形。 Red Giant Trapcode Suite包含多种插件&#xff0c…

【ARM 安全系列介绍 1 -- 奇偶校验与海明码校验详细介绍】

文章目录 奇偶校验介绍奇偶校验 python 实现奇偶校验C代码实现 海明码详细介绍 奇偶校验介绍 奇偶校验是一种错误检测方法&#xff0c;广泛应用于计算机内部以及数据通信领域。其基本原理是为了使得一组数据&#xff08;通常是一字节8位&#xff09;中的“1”的个数为偶数或奇…

代码随想录算法训练营第四十五天丨 动态规划part08

139.单词拆分 思路 背包问题 单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。 拆分时可以重复使用字典中的单词&#xff0c;说明就是一个完全背包&#xff01; 动规五部曲分析如下&#xff1a; 确定dp…

电路布线问题动态规划详解(做题思路)

对于电路布线问题&#xff0c;想必学过动态规划的大家都很清除。今天就来讲解一下这个动态规划经典题目。 目录 问题描述输入分析最优子结构代码 问题描述 在一块电路板的上、下2端分别有n个接线柱。根据电路设计&#xff0c;要求用导 线(i,π(i))将上端接线柱与下端接线柱相…

2023年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作…

mysql的备份和恢复

备份&#xff1a;完全备份 增量备份 完全备份&#xff1a;将整个数据库完整的进行备份 增量备份&#xff1a;在完全备份的基础之上&#xff0c;对后续新增的内容进行备份 备份的需求 1、在生产环境中&#xff0c;数据的安全至关重要&#xff0c;任何数据的都可能产生非常严重…

iOS 16.4 之后真机与模拟器无法使用Safari调试H5页面问题

背景 iOS 16.4之后用真机调试H5时候发现&#xff0c;Safari中开发模块下面无法调试页面 解决方案 在WKWebView中设置以下代码解决 if (available(iOS 16.4, *)) {[_webView setInspectable:YES];}然后再次调试就可以了

【Python深入学习】- 书籍推荐|数据结构和算法介绍|内建集合数据类型

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON学习系列专栏 &#x1f4ab;"没有罗马,那就自己创造罗马~" 若把编写代码比作行军打仗&#xff0c;那么要想称霸沙场&#xff0c;不能仅靠手中的利刃&#xff0c;还需深谙兵法。Python是一把利刃&…

网工内推 | 售后工程师,IP认证优先,最高15薪,年底有分红

01 威发系统&#xff08;中国&#xff09;有限公司 招聘岗位&#xff1a;售后工程师 职责描述&#xff1a; 1、负责各种规模的项目售后安装、调试和维护工作&#xff1b; 2、解决工程和维护中的一般技术问题&#xff0c;支持、协助处理其他相关的技术问题&#xff1b; 3、与…

Vue2+elementui项目导出el-table的数据为xlsx表格

1、安装3个插件 &#xff08;file-saver、 xlsx、script-loader&#xff09; npm install -S file-saver xlsxnpm install -D script-loader 2、在utils目录下新建一个 Export2Excel.js 脚本 &#xff08;我的路径在/utils/Export2Excel.js&#xff09; /* eslint-disable *…

华为ICT——第六章:深度学习和卷积神经网络/详篇

目录 1&#xff1a;深度学习卷积的重要概念&#xff1a; 2&#xff1a;CNN核心思想——局部感知&#xff1a; CNN核心思想——参数共享&#xff1a; 3&#xff1a;卷积层的功能&#xff1a; 4&#xff1a;不同深度的卷积层提取的特征&#xff1a; 5&#xff1a;卷积效果——…

CentOS7安装部署StarRocks

文章目录 CentOS7安装部署StarRocks一、前言1.简介2.环境 二、正文1.StarRocks基础1&#xff09;架构图2&#xff09;通讯端口 2.部署服务器3.安装基础环境1&#xff09;安装JDK 112&#xff09;修改机器名3&#xff09;安装GCC4&#xff09;关闭交换分区&#xff08;swap&…

为什么一家价值 17 亿美元的政府承包商选择 Liquid UI 而不是 SAP Fiori 来开发和自动化 SAP 质量管理?

背景 L3 Technologies 是一家领先的航空航天和国防技术创新企业&#xff0c;致力于开发端到端解决方案&#xff0c;以满足客户的关键任务需求。L3 在全球 130 个国家/地区拥有 50,000 多名员工&#xff0c;年收入约为 170 亿美元&#xff0c;作为一家灵活的全球技术创新企业&a…

Springboot中解析JSON字符串(jackson库ObjectMapper解析JSON字符串)

1、ObjectMapper与JSONObject比较 1、ObjectMapper属于jackson库的一部分,JSONObject属于alibaba的fastjson&#xff0c;两者各有优劣&#xff0c;可根据自己的系统环境选择使用哪种技术。 2、目前来看&#xff0c;Jackson社区相对活跃&#xff0c;Spring MVC和Spring Boot都…

并购事件是什么?

并购事件 并购指的是两家或者更多的独立企业&#xff0c;公司合并组成一家企业&#xff0c;通常由一家占优势的公司吸收一家或者多家公司。一般并购是指兼并和收购。首先&#xff0c;兼并又称吸收合并&#xff0c;是指两个独立的法人兼并和被兼并公司&#xff0c;通过并购的方…

C++特殊类与单例模式

一、特殊类 类的特殊设计方式 ①不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c; 只需让该类不能调用拷贝构造函数以及赋值运算符重载即可 在C98中&#xff0c;需要将拷贝构造设置成…

PyTorch入门学习(十九):完整的模型验证套路

目录 一、图像加载和数据转换 二、模型加载 三、前向推理 四、结果解释 一、图像加载和数据转换 首先&#xff0c;需要加载待验证的图像&#xff0c;并将其转换为模型期望的输入大小和数据类型。以下是加载图像并进行数据转换的示例&#xff1a; import torch import tor…
最新文章