首页 > 编程语言 >数组算法-差分数组

数组算法-差分数组

时间:2024-05-29 19:57:16浏览次数:19  
标签:nums int 差分 算法 vector ex 数组 diff

// 差分数组使用背景:区间元素同步增减
// 差分数组:用来表示原始数组中相邻元素的差值,表示原数组的变化。
class ex_diff{
    private:
        vector<int> diff;
    public:
        ex_diff(vector<int> nums){
            /** 求diff[]
             * diff[i] = nums[i],i==0
             * diff[i] = nums[i] - nums[i-1],i>=1
            */
            diff.resize(nums.size());
            diff[0] = nums[0];
            for(int i=1;i<nums.size();i++){
                diff[i] = nums[i] - nums[i-1];
            }
        }

        vector<int> GetSourceArrByDiff(vector<int> diff){
            /** 根据diff[]倒推原数组
             * nums[i] = diff[i],i==0
             * nums[i] = diff[i] + nums[i-1],i>=1
            */
            vector<int> t(diff.size());
            t[0] = diff[0];
            for(int i=1;i<diff.size();i++){
                t[i] = t[i-1]+diff[i];
            }
            return t;
        }

        /** 对原数组区间[l,r]内的元素统一加val时:
         * 1.只需要对差分数组diff[l]+=val,对diff[r+1]-=val;
         * 2.再根据diff[]反推出原数组
        */
        vector<int> plus_onArea(int l,int r,int val){
            diff[l] += val;
            if(r+1< sizeof(diff)/sizeof(diff[0])){
                diff[r+1] -= val;
            }
            return GetSourceArrByDiff(diff);
        }

        void test_ex_diff(){
            for(auto it:diff){
                cout << it << " ";
            }
            cout << endl;
            vector<int> ans = GetSourceArrByDiff(diff);
            for(auto it:ans){
                cout << it << " ";
            }
            cout << endl;
        }
};
int main(){

    vector<int> nums{1,3,5,7,9};
    vector<int> t = ex_diff(nums).plus_onArea(1,3,10);
    for(auto it:t){
        cout << it << " ";
    }

    return 0;
}

 

标签:nums,int,差分,算法,vector,ex,数组,diff
From: https://www.cnblogs.com/jinziguang/p/18220928

相关文章

  • 【KELM回归预测】基于麻雀算法优化核极限学习SSA-KELM-Adaboost实现风电回归预测附mat
    以下是使用麻雀算法优化核极限学习机(SSA-KELM)和Adaboost算法实现风电回归预测的MATLAB代码示例:matlab复制%导入风电数据load(‘wind_data.mat’);%假设数据存储在wind_data.mat文件中X=wind_data(:,1:end-1);%输入特征Y=wind_data(:,end);%输出标签%数......
  • 动态规划在图搜索中的应用:Floyd算法详解
    多源汇最短路问题-具有多个源点Floyd算法O(n^3)-动态规划给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出“impossible”。数据保证图中不存在负权回路。......
  • 用Python写一个热点事件追踪的算法
     要编写一个热点事件追踪的算法,首先需要明确算法的主要目标和所需的数据。在这个例子中,我们将基于微博的热度(如点赞数、转发数和评论数)来追踪热点事件。以下是一个简单的Python算法,仅供参考: 1.导入所需库 ```pythonimportrequestsfrombs4importBeautifulSoupimp......
  • 代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中
    235.二叉搜索树的最近公共祖先题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/文档讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%......
  • 59天【代码随想录算法训练营34期】第十章 单调栈part02( ● 503.下一个更大元素II ●
    503.下一个更大元素IIclassSolution:defnextGreaterElements(self,nums:List[int])->List[int]:dp=[-1]*len(nums)stack=[]foriinrange(len(nums)*2):while(len(stack)!=0andnums[i%len(nums)]>nums[stack[-1......
  • 代码随想录算法训练营day7(哈希表)
    代码随想录算法训练营day7(哈希表):今天继续学习哈希表,对一些容器的语法操作我会在内容或者产出中说明,放上题目链接可以先试着自己做做看。学习内容:4543831518学习产出:454我的思路就是前两个vector为一组,后两个为另一组。构建两个map储存两组可能出现的sum值(两......
  • 为什么算法和数据结构重要?
    算法的重要性 效率提升:优秀的算法可以显著提高程序的执行效率,减少运行时间。解决复杂问题:算法提供了解决复杂问题的系统方法,如排序、大规模数据处理、路径规划等。优化资源使用:通过优化算法,可以更好地利用计算资源,如内存和处理能力。 数据结构的重要性 数据组织:良......
  • 4. 寻找两个正序数组的中位数
    给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log(m+n))。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=[1,2],nums2=......
  • 2024-05-29:用go语言,给定一个只包含正整数的数组 nums,任务是通过多次操作最小化数组的
    2024-05-29:用go语言,给定一个只包含正整数的数组nums,任务是通过多次操作最小化数组的长度。每次操作可以从数组中选择两个不同的下标i和j,使得nums[i]和nums[j]均为正整数。然后,将nums[i]除以nums[j]的余数插入数组末尾,同时删除原始的两个元素。最终要求计算进行操作......
  • 算法:LRU 和 LFU 缓存淘汰算法
    零、资料LRU和LFU缓存淘汰算法(javascript与go语言实现) 一、基本概念LRU(LeastRecentlyUsed)和LFU(LeastFrequentlyUsed)是两种常见的缓存淘汰算法,用于在缓存空间有限的情况下选择合适的缓存对象进行淘汰,以提高缓存的利用效率LRU算法基于"最近最少使用"的原则进行淘汰......