Java之前缀和算法

news2024/10/6 16:16:39

一.前缀和

1.前缀和介绍

前缀和,顾名思义,就是前n项相加之和,和我们高中时候学习的数列中的S_{n}一个含义

例如一个等差数组a_{n}=n,那他的前n项和S_{n}=\frac{n*(n+1)}{2}   

也可知道S_{n}-S_{n-1}=a_{n}

 2.编程中的前缀和

对于一个数组nums,也可以很容易求出它的前缀和数组

    public int[] prefix(int[] nums) {
        int[] prefix = new int[nums.length];
        prefix[0] = nums[0];
        for (int i = 1; i < nums.length; ++i) {
            prefix[i] = prefix[i - 1] + nums[i];
        }
        return prefix;

    }

prefix数组的含义是: prefix[i]的值为nums数组从0到i的元素之和

其实我们这里的前缀和并不仅仅局限于前几项的和,之后我们还会涉及到乘法前缀和(后缀和),异或前缀和等等......并且还会存在后缀和的情况

二.一维数组的动态和

1.题目描述

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i])

请返回 nums 的动态和。

力扣:力扣

2.问题分析

这道题就是一道典型的前缀和题目,没什么特别之处,数组的动态和计算公式就是前缀和的含义,可以直接写出代码求解

3.代码实现

    public int[] runningSum(int[] nums) {
        int[] prefix = new int[nums.length];
        prefix[0] = nums[0];
        for (int i = 1; i < nums.length; ++i) {
            prefix[i] = prefix[i - 1] + nums[i];
        }
        return prefix;
    }

三.除自身以外数组的乘积

1.题目描述

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

不要使用除法,且在 O(n) 时间复杂度内完成此题。

力扣:力扣

2.问题分析

这个问题说的很明白,不能用除法来进行,我们的第一想法是使用乘法前缀和来进行计算,但是考虑到不能使用除法和数组中可能存在0,所以这样是不能够满足题意和解答问题的.

因此我们不妨再来设置一个数组,这个数组用来存储乘法后缀和,我们计算res[i]的时候就可以它的前缀和乘以它的后缀和,这样它的结果就可以求出来了

设置前缀和数组left[i]含义为:从nums数组的第0到第i-1项的叠乘所获得的结果

设置后缀和数组right[i]含义为:从nums数组的第i+1到最后一项项的叠乘所获得的结果

最后结果数组res[i]=left[i]*right[i]

3.代码实现

    public int[] productExceptSelf(int[] nums) {
        int[] left = new int[nums.length];//left[i]:从0-i-1项相乘
        int[] right = new int[nums.length];//right[i]:从i+1到最后一项相乘
        left[0] = 1;
        right[nums.length - 1] = 1;
        for (int i = 1; i < nums.length; ++i) {
            left[i] = left[i - 1] * nums[i - 1];
        }
        for (int j = nums.length - 2; j >= 0; --j) {
            right[j] = right[j + 1] * nums[j + 1];
        }
        int[] res = new int[nums.length];
        for (int i = 0; i < nums.length; ++i) {
            res[i] = left[i] * right[i];
        }
        return res;

    }

四.和为 K 的子数组

1.题目描述

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 

力扣:力扣

2.问题分析

这一题我们不妨先暴力思考一下,暴力就是把它的所有子数组的和全部求出来,然后和k进行判断,最后统计出等于k的子数组的数量,至少也进行两层for循环,代码如下:

    public int subarraySum(int[] nums, int k) {
        int count = 0;
        for (int end = 0; end < nums.length; ++end) {
            int sum = 0;
            for (int start = end; start >= 0; --start) {
                sum += nums[start];
                if (sum == k) {
                    count++;
                }
            }
        }
        return count;  

    }

相当于外层循环确定end,内层循环确定开始的位置start的位置

其实我们可以用一个哈希表进行优化,因为它的前缀和每次都是叠加的,其实只要统计它的每个前缀和的次数,然后prefix-k就是它从0到start的前缀和,此时start+1到end的位置就是和为k的子数组,同时map哈希表刚开始的时候还要添加key=0,value=1的键值对,因为当prefix刚好为k的时候,prefix-k=0,表示从0到end的子数组符合条件

3.代码实现

    public int subarraySum(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);//此时是从0到i的前缀和
        int prefix = 0, count = 0;
        for (int end = 0; end  < nums.length; ++end ) {
            prefix += nums[end];
            if (map.containsKey(prefix - k)) {
                count += map.get(prefix - k);
            }
            map.put(prefix, map.getOrDefault(prefix, 0) + 1);
        }
        return count;        

    }

五.形成两个异或相等数组的三元组数目

1.题目描述

给你一个整数数组 arr

现需要从数组中取三个下标 ijk ,其中 (0 <= i < j <= k < arr.length)

ab 定义如下:

  • a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
  • b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]

注意:^ 表示 按位异或 操作。

请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。

力扣:力扣

2.问题分析

首先我们想的就是需要暴力遍历i,j和k这三个值,这一题是异或前缀和,首先我们把它的异或前缀和数组求解出来,然后用异或前缀和来表达a和b,

前缀和数组prefixArr[i]的含义:nums从0到i-1的异或前缀

a=prefixArr[j]^prefixArr[i]

b=prefixArr[k+1]^prefixArr[j]

a==b  即   prefixArr[k+1]==prefixArr[i]

知道这个之后,我们就可以使用暴力的方法求解出满足条件的三元组的数量了

3.代码实现

    public int countTriplets(int[] arr) {
      int[] prefixArr = new int[arr.length + 1];
        for (int i = 1; i <= arr.length; ++i) {
            prefixArr[i] = prefixArr[i - 1] ^ arr[i - 1];
        }
        System.out.println(Arrays.toString(prefixArr));
        int count = 0;
        for (int i = 0; i < arr.length - 2; ++i) {
            for (int j = i + 1; j < arr.length - 1; ++j) {
                for (int k = j + 1; k < arr.length; ++k) {
                    if (prefixArr[k + 1] == prefixArr[i])
                        count++;

                }
            }

        }
        return count;

       

    }

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

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

相关文章

01 | TDengine3.0部署

1 TDengine简介 TDengine 是一款开源、高性能、云原生的时序数据库&#xff0c;且针对物联网、车联网、工业互联网、金融、IT 运维等场景进行了优化。TDengine 的代码&#xff0c;包括集群功能&#xff0c;都在 GNU AGPL v3.0 下开源。除核心的时序数据库功能外&#xff0c;TD…

因子的有效性检验(IC)

使用神经网络的预测值作为因子载荷&#xff08;因子暴露&#xff0c;因子值 factor&#xff09;时&#xff0c; 我们需要知道这个因子是否是有效的&#xff0c;所以要做因子的有效性检验。 当前的学术论文给出的IC&#xff0c; rankIC 这些都是属于判断因子是否有效的metric 因…

Linux系统安装Nginx常见报错问题

安装Nginx从nginx官网下载所需版本的nginx&#xff0c;http://nginx.org/下载之后&#xff0c;将安装包上传到linux系统指定路径解压文件&#xff0c;tar -zxvf nginx-1.22.1.tar.gz &#xff08;此处用1.22.1版本为例&#xff09;进入安装包目录&#xff0c;cd nginx-1.22.1执…

面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......

一、Linux系统应用和环境配置&#xff1a; 1、Linux系统的操作命令给我说10个&#xff0c;一般用什么工具远程连接Linux服务器&#xff1f; 2、Linux中的日志存储在哪里&#xff1f;怎么查看日志内容&#xff1f; 3、Linux中top和ps命令的区别&#xff1f; 4、Linux命令运行…

【极海APM32替代笔记】HAL库Flash读写操作及配置

【极海APM32替代笔记】HAL库Flash读写操作及配置 在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB 而实际上程序部分大小应该要看硬件手册来确定 可以通过配置keil工程中size的大小 来确…

改进YOLO系列 | YOLOv5/v7 更换骨干网络之 MobileNeXt

重新思考瓶颈结构以实现高效移动网络设计 倒置残差块成为了移动网络架构设计的主流。它通过引入学习倒置残差和使用线性瓶颈的两个设计规则,改变了经典的残差瓶颈。在本文中,我们重新思考了这种设计改变的必要性,并发现它可能会带来信息丢失和梯度混淆的风险。因此,我们提出…

kettle导入树形结构数据

kettle导入树形结构数据应用场景工作原理工作流程应用场景 获取数据的接口传入父节点的id&#xff0c;返回直属的子节点列表&#xff0c;通过广度优先遍历一棵树。 工作原理 使用数据库存放数据&#xff0c;利用作业进行循环遍历数据。 数据库存放节点数据&#xff0c;节点数…

运维工程师必知的十项Linux常识

1、GNU和GPL GNU计划&#xff08;又称革奴计划&#xff09;&#xff0c;是由Richard Stallman&#xff08;理查德斯托曼&#xff09;在1983年9月27日公开发起的软件集体协作计划。它的目标是创建一套完全的操作系统。GNU也称为软件工程项目。GPL是GNU的通用公共许可证&#xf…

数据在内存中的存储【下篇】

文章目录⚙️3.浮点型在内存中的存储&#x1f529;3.1.一个例子&#x1f529;3.2.浮点数的存储规则&#x1f529;3.3.例题解析⚙️3.浮点型在内存中的存储 &#x1f529;3.1.一个例子 &#x1f534;浮点数存储的例子&#xff1a;&#x1f447; int main() {int n 9;float* …

用Python unittest搭建自动化测试框架

unittest是xUnit系列框架中的一员&#xff0c;如果你了解xUnit的其他成员&#xff0c;那你用unittest来应该是很轻松的&#xff0c;它们的工作方式都差不多。 unittest核心工作原理 unittest中最核心的四个概念是&#xff1a;test case, test suite, test runner, test fixtu…

华为OD机试 - 人数最多的站点(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

【mybatis】

对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 ORM框架是连接数据库的桥梁&#xff0c;只要提供了持久化类与表的映射关系&#xff0c;ORM框架在运行时就能参照映射文…

【Yolov5】深度模型进行训练-CPU版

yolo5模型训练1.yolov5自己的模型训练1.1 git下载对应的源码到服务器1.2 从最新的 YOLOv5版本自动下载模型。1.3 detect.py 推断1.4 train.py进行训练1.5 yolo的原理2.训练自己的模型2.1 Data下面新建如图目录Mydata2.1 lableimg进行数据标注的图形2.2 数据集2.3 train.py调整d…

IP 协议

1.IP协议报头如下图:版本号 代表的是当前的IP协议的版本,此处的版本一共有两个取值:v4和v6.本文着重针对v4版本进行解析.首部长度 代表的是整个IP报头的长度,这个报头长度是可变长的,可变长的原因在于报头中的选项,这个属性是一个可有可无的属性,会改变报头长度,它的单位是32bi…

5个原因告诉您为什么要拥有个人IP

在数字时代中&#xff0c;信息每分每秒都在飞速地增长&#xff0c;对于企业和个人来说&#xff0c;获得关注变得越来越具有挑战性。如果您希望在网上创造某种形式的存在感&#xff0c;保持内容的原创性和新鲜度是您通往成功的路上不可避免的挑战。尽管如此&#xff0c;从竞争对…

电商项目之Feign与Dubbo技术选型

文章目录1 问题背景2 前言3 思路4 Feign与Dubbo的区别5 总结6 真实案例1 问题背景 电商项目&#xff0c;B端以consul作为注册中心。重构了一个营销服务&#xff0c;以Nacos作为注册中心。B端需要调用营销服务。关于远程调用框架&#xff0c;营销服务用了Dubbo&#xff0c;而B端…

吉卜力风格水彩画怎么画?

著名的水彩艺术家陈坚曾说&#xff1a;“水彩是用水润调和形成的饱和度极高的艺术画面&#xff0c;在纸上晕染的画面面积、强度等具有许多随意性&#xff0c;天空的颜色乌云密布&#xff0c;都是很随意的&#xff0c;难以模仿。” 是的&#xff0c;水彩画的妙处就在于不确定的…

C语言数据结构初阶(1)----时空复杂度

目录 1. 数据结构&#xff0c;算法的概念 2. 算法的效率 2.1 算法复杂度 3. 时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 3.3 小试牛刀 4. 算法的空间复杂度 4.1 小试牛刀 1. 数据结构&#xff0c;算法的概念 数据结构(Data Structure)是计算机存储、组织数据…

2023从0开始学性能(3) —— 探索性能测试流程2

性能测试计划 性能测试的计划中应该由项目描述、项目的业务模型和性能指标&#xff08;指标来源于调研需求中预期指标&#xff09;&#xff0c;性能测试环境说明&#xff08;前期调研的配置信息&#xff09;以及测试的场景设计&#xff0c;具体的我们后面再慢慢说。 性能测试场…

4123版驱动最新支持《霍格沃茨之遗》,英特尔锐炫显卡带你畅游魔法世界

2023年开年最火的3A大作&#xff0c;那一定是近期上架steam平台的《霍格沃茨之遗》&#xff0c;这款游戏在2020年9月份曝光&#xff0c;游戏根据《哈利波特》系列书籍内容改编&#xff0c;作为一款开放式的3A大作&#xff0c;《霍格沃兹之遗》目前在steam上的实时在线人数已经突…