当前位置: 首页 > news >正文

算法前缀和—Java版

前缀和概念

  • 假设有数组 A=[1,2,3,4,5,6,7] 为原数组,有数组 B作为A的前缀和数组,那么B=[1,3,6,10,15,21,28];可以发现B[i] = A[0]+....+A[i],即B[i]是数组A的前面i个数的总和。可以前缀和表示如下公式:

    B[i]=∑j=0iA[j]B[i]=\sum_{j=0}^{i}{A[j]} B[i]=j=0iA[j]

  • 因此有了前缀和数组可以简化我们算法就子区间和,假设没有前缀和要求数组A区间[2,4]的总和,我们需要从 i=2 遍历 到 i=4 ,时间复杂度为O(n),通过前缀和只需要计算 B[4]-B[1]即可,因此可以将子区间和表示如下公式:B[i,j]=B[j]-B[i-1],j>=i 。但是上述子区间表示法在实际应用中会有问题,即当求区间B[0,j]的时候,会出现下标等于-1的情况,因此一般在程序中写成如下:

    B[i,j]=B[j]−B[i]+A[i]B[i,j]=B[j]-B[i]+A[i] B[i,j]=B[j]B[i]+A[i]

递推构造前缀和

  • 可以使用递推式构造前缀和,递推公式如下:

    B[i]=B[i−1]+A[i],B[0]=A[0]B[i]=B[i-1]+A[i],B[0]=A[0] B[i]=B[i1]+A[i],B[0]=A[0]

不仅仅是这些

  • 这些直接求前缀数字和的题目是前缀和最简单的题型,变换题型一般是记录前i个字符或者数组的状态,当遍历后续的i+k时求得前i+k的状态,然后比较两者之间的变化,推出中间长度k子串的状态看看是否满足题目要求。这才是前缀和的灵魂,前缀和一般和数组、子串、连续等关键字有关!!尤其是数组和字符串的问题,求最长子串,求数组满足条件的连续的最长长度!!!通过题目练习总结,尤其是最后两题!

LeetCode

1685. 有序数组中差绝对值之和

    public int[] getSumAbsoluteDifferences(int[] nums) {//使用一个规律,即数组是递增的,即后一个数的和与前一个数的和之间的关系//关系是,假设第i+1个数比第i个数大k,则i+1之后的数会在sum(i)的基础上少// (n-i+1)*k , 而i之前的数会在sum(i)的基础上多 (i-1)*kint n = nums.length;int[] res = new int[n];int sum = 0;for (int i = 0; i < n; i++) {sum+=(Math.abs(nums[i]-nums[0]))}res[0] = sum;for (int i = 1; i < n; i++) {int k = nums[i]-nums[i-1];int a = (i-1)*k;int b = (n-i-1)*k;res[i] = res[i-1]+a-b;}return res;}

1423. 可获得的最大点数

  • 一开始秒想到动态规划,但是超时,正确思路是反过来找最小的剩下的连续序列。使用滑动窗口!
public int maxscore(int[] cardPoints,int left,int right,int k){if(k==1 && left<right){int value = Math.max(cardPoints[right],cardPoints[left]);map.put(""+left+right+k,value);return value;}int a = 0;int b = 0;if(map.containsKey(""+(left+1)+right+(k-1))){a = map.get(""+(left+1)+right+(k-1))+cardPoints[left];}else {a = maxscore(cardPoints,left+1,right,k-1)+cardPoints[left];}if(map.containsKey(""+left+(right-1)+(k-1))){b = map.get(""+(left)+(right-1)+(k-1))+cardPoints[right];}else {b = maxscore(cardPoints,left,(right-1),k-1)+cardPoints[right];}return Math.max(a,b);}public int maxScore(int[] cardPoints, int k) {//动态规划map = new HashMap<>();return maxscore(cardPoints,0,cardPoints.length-1,k);}

正确解法:

public int maxScore(int[] cardPoints, int k) {int n = cardPoints.length-k;int[] B = new int[cardPoints.length];B[0] = cardPoints[0];for (int i = 1; i < cardPoints.length; i++) {B[i] = B[i-1]+cardPoints[i];}if(cardPoints.length==k){return B[cardPoints.length-1];}int minn = Integer.MAX_VALUE;for (int i = 0; i <= k; i++) {int sum = B[i+n-1]-B[i]+cardPoints[i];if(sum<minn){minn = sum;}}return B[cardPoints.length-1]-minn;}

1371. 每个元音包含偶数次的最长子字符串

525. 连续数组

  • 为什么挂这两道题,因为如果想到了这两道题的前缀和才是真的入门了,首先说525题。这道题前面已经提过,这道题需要把0变成-1,如果前i个数的和为-2,前i+7的和也是-2,那么巧了,那就意味着从i+1到i+7的和为0,即1和-1的数量一样多。这就是前缀的灵魂。那么换成1371,要求五个字母出现都是偶数的最长子字符串的长度,那么5个字符的奇偶状态就有32种,因此,同理在前i个字符如果是 ‘a’,‘e’,‘i’, ‘o’,都是偶数,'u’是奇数,而前i+9个字符前三个是偶数,后两个是奇数,那么意味着什么?意味着从i+1到i+9的子串中有奇数个 ‘o’ 。这只是一个例子,所以需要使用前i+k的状态与前i的状态对比,才知道中间这k个字符是什么状态。因此,前缀和并一定是前面数字之和,也可以是状态的变化。通过后面i+k的状态与i的状态推出中间的状态。这就是前缀和的灵魂。

  • class Solution {public int findTheLongestSubstring(String s) {int n = s.length();int[] pos = new int[1 << 5];Arrays.fill(pos, -1);int ans = 0, status = 0;pos[0] = 0;for (int i = 0; i < n; i++) {char ch = s.charAt(i);if (ch == 'a') {status ^= (1 << 0);} else if (ch == 'e') {status ^= (1 << 1);} else if (ch == 'i') {status ^= (1 << 2);} else if (ch == 'o') {status ^= (1 << 3);} else if (ch == 'u') {status ^= (1 << 4);}if (pos[status] >= 0) {ans = Math.max(ans, i + 1 - pos[status]);} else {pos[status] = i + 1;}}return ans;}
    }
    

相关文章:

算法前缀和—Java版

前缀和概念 假设有数组 A[1,2,3,4,5,6,7] 为原数组&#xff0c;有数组 B作为A的前缀和数组&#xff0c;那么B[1,3,6,10,15,21,28]&#xff1b;可以发现B[i] A[0]....A[i]&#xff0c;即B[i]是数组A的前面i个数的总和。可以前缀和表示如下公式&#xff1a; B[i]∑j0iA[j]B[i]\s…...

拨开迷雾 看见vivo穿越周期的秘密

文|智能相对论作者|佘凯文任何一个行业都有周期性&#xff0c;就好像我们在做股票投资的时候&#xff0c;提到最多的就是周期规律&#xff0c;因为只有掌握规律才可以让我们赚到钱。所以不论是哪家公司都逃脱不了行业周期的宿命。行业寒冬方显强者本色就拿手机行业来说吧&#…...

浅谈常用的日志框架

文章目录1.为什么需要日志框架2.常见日志框架2.1.日志框架介绍2.2.市面上的日志框架3.Slf4j使用3.1.如何在系统中使用SLF4j3.2.可能存在的问题4.SpringBoot日志的默认配置5.SpringBoot指定日志文件6.切换日志框架1.为什么需要日志框架 通过日志的方式记录系统运行的过程或错误以…...

字节是真的难进,测开4面终上岸,压抑5个月,终于可以放声呐喊

这次字节的面试&#xff0c;给我的感触很深&#xff0c;意识到基础的重要性。一共经历了五轮面试&#xff1a;技术4面&#xff0b;HR面。 下面看正文 本人自动专业毕业&#xff0c;压抑了五个多月&#xff0c;终于鼓起勇气&#xff0c;去字节面试&#xff0c;下面是我的面试过…...

Bash初识

Bash初识 1.简介: 一.什么是shell&#xff1f; 用过计算机的人知道&#xff0c;我只要点点鼠标计算机就能按照我们的要求来进行相应的操作&#xff0c;那么&#xff0c;你有没有想过计算机为什么能够识别我们的操作呢&#xff1f;俗话说&#xff0c;人有人语&#xff0c;机有机…...

ElasticSearch Script 操作数据最详细介绍

文章目录ElasticSearch Script基础介绍基础用法List类型数据新增、删除nested数据新增、删除根据指定条件修改数据根据指定条件修改多个字段数据-查询条件也使用脚本根据指定条件删除nested中子数据数据根据条件删除数据删除之后结果创建脚本&#xff0c;通过脚本调用根据条件查…...

【黑盒模糊测试】路由器固件漏洞挖掘实战--AFL++ qemu_mode

前言 很久之前就想写AFL++的qemu_mode了,只是模糊测试专题的文章有些过于耗费时间,加上工作原因导致一直搁置。最近需要出差会用到黑盒模糊测试,所以就当做复习一遍,我记得Fuzzing 101也有一个qemu_mode的练习,有空的话下一篇文章更新吧~ 编写不易,如果能够帮助到你,希望…...

【java实现Word模板导出】Xdocreport和Freemaker

如果只是生成简单的word文件的话可以使用 Hutool 上手简单使用方便。 但如果需要导出内容比较复杂的word文件的话用那个就不合适了&#xff0c;这时候就需要Xdocreport这玩意了。 制作模板 新建一个word文档在需要插入变量的地方使用快捷键 Crtl F9 来生成一个域 然后右键单…...

Stable-Baselines 3 部分源代码解读 3 ppo.py

Stable-Baselines 3 部分源代码解读 ./ppo/ppo.py 前言 阅读PPO相关的源码&#xff0c;了解一下标准库是如何建立PPO算法以及各种tricks的&#xff0c;以便于自己的复现。 在Pycharm里面一直跳转&#xff0c;可以看到PPO类是最终继承于基类&#xff0c;也就是这个py文件的内…...

[业务逻辑] 订单超时怎么处理

文章目录1.订单的过程分析2.JDK自带的延时队列 (单机)3.RabbitMQ的延时消息 (消息队列方案)4.RocketMQ的定时消息 (消息队列方案)5.Redis过期监听 (Redis方案)6.定时任务分布式批处理 (扫表轮训方案)7.总结1.订单的过程分析 一个订单流程中有许多环节要用到超时处理 买家超时未…...

iOS上架及证书最新创建流程

目前使用uniapp框架开发app&#xff0c;大大节省了我们兼容多端应用的工作量和人手&#xff0c;所以目前非常缺乏ios上架和证书创建流程流程的文档假如你没有任何的打包或上架经验&#xff0c;参考本文有很大的收益。通常申请ios证书和上架ipa应用&#xff0c;是需要MAC电脑的&…...

python入门

Python是一种高级编程语言&#xff0c;由荷兰计算机科学家Guido van Rossum于1991年发明。Python语言具有简洁、清晰和易于阅读的语法&#xff0c;同时也拥有广泛的应用领域&#xff0c;包括Web开发、数据分析、人工智能、科学计算等。Python的特点是能够快速开发原型和简单易读…...

Linux部署java项目

Linux部署java项目启动虚拟机这部分的操作之前学习虚拟机时已经做过,可以参照之前的笔记即可推荐大家重新解压纯净版的RockyLinux来实现启动后登录rockylinuxsudo su -修改root用户密码passwd下面就切换到客户端软件连接虚拟机ifconfigifconfig | more查看ip地址使用Bvssh软件连…...

elisp 从简单实例开始.

elisp 从简单实例开始. 我们怎样用elisp 与电脑交互,先从简单实例开始, 逐渐掌握它的几个对象. 与电脑交互,总要有输入,输出,先看两个简单例子. 输入从minibuffer,输出可以是minibuffer 或者缓冲区. 一: 从minibuffer 中输入, 在指定缓冲中插入文字(insert)x ;;;;;;;;;;;;;;;;…...

ThreeJS加载geojson数据实现3D地图

ThreeJS加载geojson数据实现3D地图,主要通过借助geojson地理信息数据转摩托尔坐标实现,中间借助了d3.js的地图处理方法,最后通过threejs渲染到页面上: 通过平台获取GeoJson格式的行政区域借助d3的方法,将坐标系转摩托尔坐标利用ThreeJS中的自定义Shape,绘制地图利用Three…...

深度学习无监督磁共振重建方法调研(二)

深度学习无监督磁共振重建方法调研&#xff08;二&#xff09;Self-supervised learning of physics-guided reconstruction neural networks without fully sampled reference data&#xff08;Magnetic Resonance in Medicine 2020&#xff09;模型设计实验结果PARCEL: Physi…...

蓝桥杯入门即劝退(十九)两两交换链表

-----持续更新蓝桥杯入门系列算法实例-------- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章对你有所帮助-------- 一、题目描述 给你一个链表&#xff0c;两两交换其中…...

【Java 面试合集】接口以及抽象类

接口以及抽象类 1. 概述 嗨&#xff0c;【Java 面试合集】又来了&#xff0c;今天给大家分享的内容是接口以及抽象类。一看这个概念很多人都知道&#xff0c;但是方方面面的细节不一定知道哦&#xff0c;今天我们就从方方面面的细节来讲讲 2. 相同点&#xff1a; 都是上层的抽…...

LeetCode 2391. 收集垃圾的最少总时间

给你一个下标从 0 开始的字符串数组 garbage &#xff0c;其中 garbage[i] 表示第 i 个房子的垃圾集合。garbage[i] 只包含字符 ‘M’ &#xff0c;‘P’ 和 ‘G’ &#xff0c;但可能包含多个相同字符&#xff0c;每个字符分别表示一单位的金属、纸和玻璃。垃圾车收拾 一 单位…...

【PMP考试最新解读】第七版《PMBOK》应该如何备考?(含最新资料)

PMP新版大纲加入了ACP敏捷管理的内容&#xff0c;而且还不少&#xff0c;敏捷混合题型占到了 50%&#xff0c;前不久官方也发了通知8月启用第七版《PMBOK》&#xff0c;大家都觉得考试难度提升了&#xff0c;我从新考纲考完下来&#xff0c;最开始也被折磨过一段时间&#xff0…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...