「前缀和以及差分数组」

news2024/11/16 15:47:18

文章目录

  • 1 前缀和数组
    • 1.1 题解
    • 1.2 Code
    • 1.3 结果
  • 2 二维矩阵的前缀和数组
    • 2.1 题解
    • 2.2 Code
    • 2.3 结果
  • 3 差分数组

1 前缀和数组

适用于快速频繁的计算一个索引区间内的元素之和,核心思想就是使用一个前缀和数组,然后使用前缀和数组的两个元素之差,来快速判断原来的数组的子数组之和,具体如下题所示。

在这里插入图片描述

1.1 题解

前缀和数组的具体思路就是,先new一个新的数组preSum出来,preSum[i]记录的是nums[0…i-1],也就是nums数组中每一个元素的前缀和。比如preSum记录索引为0的元素的前缀和为2,记录索引为1的元素的前缀和为-2+0=-2,索引为2元素的前缀和为-2+0+3=1以此类推,这样就能达到一个快速计算前缀和的一个技巧。

1.2 Code

class NumArray {
private:
    vector<int>preSum;
public:
    NumArray(vector<int>& nums) {
        preSum.resize(nums.size() + 1);
        for (int i = 1; i < preSum.size(); ++i)
        {
            preSum[i] = preSum[i - 1] + nums[i - 1];
        }
    }
    
    int sumRange(int left, int right) {
        return preSum[right + 1] - preSum[left];
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * int param_1 = obj->sumRange(left,right);
 */

1.3 结果

在这里插入图片描述

2 二维矩阵的前缀和数组

在这里插入图片描述

2.1 题解

给定一个矩阵的左上角元素以及右下角元素,就能知道矩阵的一个大小了,现在题目给出这两个数值,然后要求给出这个子矩阵的所有元素之和,如上图就是红框内元素之和。因为这是矩阵的加减法,可以用比较大的矩阵减去两个小矩阵再加回来多减的一个部分,就能得到所求的结果。

2.2 Code

class NumMatrix {
// 定义:preSum[i][j] 记录 matrix 中子矩阵 [0, 0, i-1, j-1] 的元素和
private:vector<vector<int>> preSum;
public:
    NumMatrix(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        if (m == 0 || n == 0) return;
        //构造前缀和数组
        preSum.resize(m+1, vector<int>(n+1));
        for (int i = 1; i <= m; ++i)
        {
            for (int j = 1; j <= n; ++j)
            {
                preSum[i][j] = preSum[i-1][j] + preSum[i][j-1] + matrix[i - 1][j - 1] - preSum[i-1][j-1];
            }
        }
    }
    
    int sumRegion(int x1, int y1, int x2, int y2) {
        return preSum[x2+1][y2+1] - preSum[x1][y2+1] - preSum[x2+1][y1] + preSum[x1][y1];
    }
};

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix* obj = new NumMatrix(matrix);
 * int param_1 = obj->sumRegion(row1,col1,row2,col2);
 */

2.3 结果

在这里插入图片描述

3 差分数组

差分数组主要适用场景主要是对原数组的某个区间的元素进行增减。前缀和是频繁求区间和,差分数组是频繁修改某个区间的元素,同时增加或者减少。比如同时给nums中所有元素加1,再同时减2,最后输出nums。

构造差分数组:

vector<int> diff;
diff.resize(nums.size());
diff[0] = nums[0];//首元素就是nums的首元素
for (int i = 1; i < num.size(); ++i)
{
	diff[i] = nums[i] - nums[i - 1];//后一项减前一项
}

还原差分数组:

vector<int> res;
res.resize(diff.size());
res[0] = diff[0];
for (int i = 1; i < diff.size(); ++i)
{
	res[i] = res[i - 1] + diff[i];
}

有了diff数组之后,想要给原数组当中,索引为i到j的数同时加减就很简单了,比如说对nums[i…j]当中进行整体加3,就可以先对diff[i] + 3,再让diff[j+1] -3,这样就可以达到上述效果。

// 差分数组工具类
class Difference {
    // 差分数组
    private int[] diff;
    
    /* 输入一个初始数组,区间操作将在这个数组上进行 */
    public Difference(int[] nums) {
        assert nums.length > 0;
        diff = new int[nums.length];
        // 根据初始数组构造差分数组
        diff[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            diff[i] = nums[i] - nums[i - 1];
        }
    }

    /* 给闭区间 [i, j] 增加 val(可以是负数)*/
    public void increment(int i, int j, int val) {
        diff[i] += val;
        if (j + 1 < diff.length) {
            diff[j + 1] -= val;
        }
    }

    /* 返回结果数组 */
    public int[] result() {
        int[] res = new int[diff.length];
        // 根据差分数组构造结果数组
        res[0] = diff[0];
        for (int i = 1; i < diff.length; i++) {
            res[i] = res[i - 1] + diff[i];
        }
        return res;
    }
}

如力扣370题,区间加法:
在这里插入图片描述

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

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

相关文章

Postman(一)--接口测试知识准备

1.0 前言 ​ 应用程序编程接口&#xff08;Application Programming Interface, API&#xff09;是这些年来最流行的技术之一&#xff0c;强大的Web应用程序和领先的移动应用程序都离不开后端强大的API。API技术的应用给系统开发带来了便利&#xff0c;但也对测试人员提出了更…

【AGI】Copilot AI编程辅助工具安装教程

GitHub和OpenAI联合为程序员们送上了编程神器——GitHub Copilot。 但是&#xff0c;Copilot目前不提供公开使用&#xff0c;需要注册账号通过审核&#xff0c;我也提交了申请&#xff1a;这里第一期记录下&#xff0c;开启教程&#xff0c;欢迎大佬们来讨论交流。

Jmeter性能测试:高并发分布式性能测试

一、为什么要进行分布式性能测试 当进行高并发性能测试的时候&#xff0c;受限于Jmeter工具本身和电脑硬件的原因&#xff0c;无法满足我们对大并发性能测试的要求。 基于这种场景下&#xff0c;我们就需要采用分布式的方式来实现我们高并发的性能测试要求。 二、分布式性能测…

微信云开发管理工具入门教程

前言 微信云开发管理工具是是什么&#xff1f; 提供了一套云开发的后台管理工具&#xff0c;并且提供低代码开发工具&#xff0c;开发者可基于低代码工具&#xff0c;连接到业务数据库&#xff0c;拖拽组件生成前端UI&#xff0c;从而定制各类管理端应用。 在这里肯定有同学会…

python 自动化数据提取之正则表达式

>>>> 前 言 我们在做接口自动化的时候&#xff0c;处理接口依赖的相关数据时&#xff0c;通常会使用正则表达式来进行提取相关的数据&#xff0c;今天在这边和大家聊聊如何在python中使用正则表达式。 正则表达式&#xff0c;又称正规表示式、正规表示法、正规…

华为数通HCIP-BGP EVPN基础

MP-BGP MP-BGP&#xff08;Multiprotocol Extensions for BGP-4&#xff09;在RFC4760中被定义&#xff0c;用于实现BGP-4的扩展以允许BGP携带多种网络层协议&#xff08;例如IPv6、L3VPN、EVPN等&#xff09;。这种扩展有很好的后向兼容性&#xff0c;即一个支持MP-BGP的路由…

企业数据,大语言模型和矢量数据库

随着ChatGPT的推出&#xff0c;通用人工智能的时代缓缓拉开序幕。我们第一次看到市场在追求人工智能开发者&#xff0c;而不是以往的开发者寻找市场。每一个企业都有大量的数据&#xff0c;私有的用户数据&#xff0c;自己积累的行业数据&#xff0c;产品数据&#xff0c;生产线…

MySQL数据库分库分表备份(shell脚本)

创建目录 mkdir /server/scripts 一、使用脚本实现分库备份 1、创建脚本并编写 [rootlocalhost scripts]# vim bak_db_v1.sh #!/bin/bash ######################################### # File Name:bak_db_v1.sh # Version: V1.0 # Author:Shen QL # Email:17702390000163.co…

Vue2基础十、Vuex

零、文章目录 Vue2基础十、Vuex 1、vuex概述 &#xff08;1&#xff09;vuex是什么 vuex 是一个 vue 的 状态管理工具&#xff0c;状态就是数据。大白话&#xff1a;vuex 是一个插件&#xff0c;可以帮我们管理 vue 通用的数据 (多组件共享的数据) 例如&#xff1a;购物车数…

驱动_阻塞io内核实现

相关API 1.定义等待队列头 wait_queue_head_t wq_head; 2.void init_waitqueue_head(struct wait_queue_head *wq_head) 功能&#xff1a;用于初始化一个等待队列 参数&#xff1a; wq_head:等待队列头节点指针 返回值&#xff1a;无3.wait_event(wq_head, condition) 功能&am…

Antd DatePicker 日期选择框设置中文不生效

Antd 版本&#xff1a;4.21.6 moment 版本&#xff1a; 2.29.4 这里是 Antd 官网对于日期选择框国际化配置的说明 我是对 DatePicker 单独进行配置&#xff0c;而没有使用全局配置&#xff0c;但是发现代码未生效。 后来发现问题在于引入的路径有误&#xff0c;如下&#xf…

Python中字符串拼接有哪些方法

目录 什么是字符串拼接 为什么要进行字符串拼接 Python中字符串拼接有哪些方法&#xff1f; 什么是字符串拼接 字符串拼接是将多个字符串连接在一起形成一个新的字符串的操作。在编程中&#xff0c;字符串拼接经常用于将不同的字符串组合在一起&#xff0c;以创建更长或更有…

GO语言日志切割 + 记录调用源

准备工作 日志记录对程序排查问题比较关键&#xff0c;记录下GO中日志选择&#xff0c;从以下出发点考虑&#xff1a; 日志文件能自动切割&#xff0c;以免过大能记录从哪个文件哪行代码调用的&#xff0c;方便排查问题配置简单明了库文件使用人数较多&#xff0c;稳定 经过一段…

一大波涨姿势的小众网站,带你解锁新大陆!

夏日炎炎&#xff0c;给大家分享20个涨姿势的小众网站&#xff0c;打开你的新世界大门&#xff01; 1、电台公园 http://radio.garden/ 可以收听到世界各地的电台&#xff0c;在世界地图上选一个绿点&#xff0c;就可以收听当地的电台了。 2、下载 4K 画质 Bing 壁纸 https…

[OnWork.Tools]系列 03-软件设置

主题设置 点击右上角的设置按钮 可以切换为深色模式 系统设置 点击设置 开机自动运行: 开机自动启动 关闭最小化: 点击右上角关闭按钮时最小化到托盘 快捷键设置: 快速唤醒/隐藏界面 默认为AltO 关于 可以快速打开文件夹,方便调试使用

0-超级计算机

超级计算机 概述主要特点处理能力并行处理大规模存储应用领域能耗云超算 中国超算流行体系结构片内异构节点内异构 概述 当谈到超级计算机时&#xff0c;我们指的是性能超高、处理能力强大的计算机系统。 它们通常由数以千计的处理器核心组成&#xff0c;并具备大规模的内存和…

初识mysql数据库之事务的概念及操作

目录 一、数据库多客户端访问问题 1. 数据库的CURD无限制带来的问题 2. 如何解决CURD导致的问题 二、事务的概念 1. 什么是事务 2. 事务的四个属性 3. mysql对事务的管理 4. 为什么会有事务 5. 事务的版本支持 三、事务的操作 1. 事务提交方式 2. 事务操作的准备工…

力扣简单1道_两数之和

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。你可以按任意顺序…

【面试题】芯片中的IR drop现象是什么?

这里是尼德兰的喵芯片面试相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏,也欢迎您对文中存在的问题和疑惑进行评论 此外,gitee仓库尼德兰的喵 (gjm9999) - Gitee.com与微信公众平台也期待您的访问 让我们一起为芯片前端全栈工程师而努力!!!! 今天突然…

matlab Tabel操作

https://zhuanlan.zhihu.com/p/104266351 Table数据类型的引用要三点要注意&#xff1a; 1&#xff09;{}–花括号&#xff08;curly braces&#xff09;&#xff0c;()–小括号&#xff08;parentheses&#xff09;, .–圆点&#xff08;dot&#xff09;对Table类型数据的作用…