差分数组 ----- 从零开始的数据结构

一.前言:

我们都知道 "前缀和"数组 适用于 "原数组 " 不被修改的场景下,频繁查询某一个区间的累加和---查询时候时间复杂度是 O(1)

本文要提及的 "差分数组" 则是 适用于频繁对原数组的某一个 "区间" 的元素进行增减时-----修改数据的时候时间复杂度就是O(1)

我们会发现这两种数组都运用了空间换时间的思想,降低在某项功能的时间复杂度

简单介绍了两者的异同之后,我们步入今天的正题,差分数组!

二.差分数组

1.储存内容:

差分数组储存的内容是 "原数组" 的第 i 项 与 第 i - 1 项的差值(第一个元素特殊处理)

假设原数组是nums , 差分数组是 diff

• diff【0】= nums0

• diff【i】 = nums【i】 - nums【i - 1】

那么我们就可以顺利成章的写出构造"差分数组"的代码了

2.构造:

cpp 复制代码
class difference{
   private:
       vector<int> diff;
   public:
       difference(vector<int>& nums){
           diff = vector<int>(nums.size(),0);//构造了一个nums大小的差分数组
           diff[0] = nums[0];
           for (int i = 1; i < nums.size(); i++){
             diff[i] = nums[i] - nums[i-1];
           }
       }// nums是原数组

3.原数组区间增删的更改------核心功能:

假设我们要给原数组 i 到 j 区间都增加 val

我们知道差分数组的每一个下标值都代表的是 原数组 i 下标和 i -1 下标的"差值"

那么 i 位置的 差值 相比 i -1 是不是 会增加 "val"

i 到 j 区间因为都增加,那么差值不变,我们不动它

j + 1 相比于 j 下标 是不是就小了 "val"

那么代码可出:

cpp 复制代码
  void increment(int i , int j , int val){
            diff[i] += val;
            if (j + 1 < diff.size()){
                diff[j+1] -= val;
            }
       }

4. 返回差分数组

cpp 复制代码
  vector<int> result(){
            vector<int> res(diff.size());
            res[0] = diff[0];
            for (int i = 1; i < diff.size(); i++){
                res[i] = res[i-1] + diff[i];
            }
            return res;
       }

三.结语:

希望本文对你有所帮助

喜欢的话,可以点一个免费的赞和收藏

相关推荐
Logic1012 小时前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
wang09073 小时前
硬着头皮学数据结构和算法之Myers算法
数据结构·算法
垆边人似月.4 小时前
华为机试题 :最长递增子序列题目
数据结构·c++·算法·华为
yi01115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
禾小西18 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
H.莓飛18 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有19 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
chenbingjie_c20 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
垆边人似月.1 天前
华为OD算法题:查找众数及中位数
数据结构·算法·leetcode
CoderYanger1 天前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划