首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有趣的差分,区间修改的优化选择

做数组题的时候,可能会多次去改变某一区间元素的值,多重利用循环效率过差,这里我们来了解一下差分,复杂度为O(1) 什么是差分? 差分就是,数组中每一项减去它前一项的差值,该差值作为差分数组。...,我们会发现,在对区间[1,3] 进行处理的时候,差分序列只有 1和4 发生了相应的改变。...因为在对区间[1,3]的元素进行相应的+1操作后,a1+1, a2+1, a3+1, a4, a5, a6......,我们再进行求差分:a1+1-(a0=0), a2-a1, a3-a2, a4-a3-1, a5-a4, a6-a5,我们就可以直观的看出,其实当原序列进行区间统一改变时,对于差分序列而言受影响的只有对应区间的第一个元素...,和最后一个元素的下一位,即b[l]+1,b[r+1]-1 公式:当区间[l,r]内所有元素+c的时候,对应的差分序列:b[l]=b[l]+c, b[r]=b[r+1]-c 再经过前缀求和就可得到,进行区间

33430
您找到你想要的搜索结果了吗?
是的
没有找到

秒懂力扣区间题目:重叠区间、合并区间、插入区间

插入区间 ,我们再顺便练习两道类似的简单区间题目,比如:判断区间是否重叠(252. 会议室)、56. 合并区间。...思路分析 和上一题一样,首先对区间按照起始端点进行升序排序,然后逐个判断当前区间是否与前一个区间重叠,如果不重叠的话将当前区间直接加入结果集,反之如果重叠的话,就将当前区间与前一个区间进行合并。...插入区间 难度:Medium 给出一个无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然 有序且不重叠(如果有必要的话,可以 合并区间)。...具体步骤如下: 首先将新区间左边且相离的区间加入结果集(遍历时,如果当前区间的结束位置小于新区间的开始位置,说明当前区间在新区间的左边且相离); 接着判断当前区间是否与新区间重叠,重叠的话就进行合并,直到遍历到当前区间在新区间的右边且相离...删除被覆盖区间 难度:Easy 给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。在完成所有删除操作后,请你返回列表中剩余区间的数目。

7.3K20

js 实现选择排序及优化

// 选择排序 // 原理:进行 n-1 趟 循环,每趟循环中遍历所有未排好序的数,第一趟循环,从第0个元素开始向后遍历,找到 最小的元素,与第1 一个元素进行交换,第二趟,从第 1 个元素开始向后遍历...找到最小值与第2个元素 进行交换,以此类推 // 从而得出规律,每次遍历元素开始位置为 i+1,并维护每轮循环的最小值的索引,一轮循环结束后,通过最小值的索引获取到最小值,与起始位置交换 // 稳定性:因为选择排序每次找到最小值...arr[minIndex] = temp; } console.log(`执行了${count}趟循环`); return arr; } console.log("普通选择排序...0, 1, 6, 5])); // 执行了9趟循环 console.log(selectSort([1, 2, 3, 4, 5, 6, 7, 8, 9, 9])); // 执行了9趟循环 // 优化选择排序...break; } } console.log(`执行了${count}趟循环`); return arr; } console.log("普通选择排序

4.5K10

区间选点

*/ 给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。...输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 /*输入格式*/ 第一行包含整数 N,表示区间数。...我们先来介绍一下题目: /*题目名称*/ 区间覆盖 /*题目介绍*/ 给定 N 个闭区间 [ai,bi] 以及一个线段区间 [s,t],请你选择尽量少的区间,将指定线段区间完全覆盖...我们开始判断,我们需要该区间的左端点小于等于st,且区间的右端点尽可能的大 那么我们可以设置条件:p[i].l <= st 这时进入选择区域 然后我们需要选择一个右端点最大的区间...,我们可以全部选择,用max来判定即可:maxr = Math.max(maxr,p[i].r) 当最后该组内的选择结束后,我们首先需要判断是否符合条件(是否可以覆盖起始点),然后我们再去更新起始点的位置进行下一轮判定

86020

分块之区间查询与区间修改

给出一个长为n的数列,以及n个操作,操作涉及区间加法,区间求和。 这题的询问变成了区间上的询问,不完整的块还是暴力;而要想快速统计完整块的答案,需要维护每个块的元素和,先要预处理一下。...考虑区间修改操作,不完整的块直接改,顺便更新块的元素和;完整的块类似之前标记的做法,直接根据块的元素和所加的值计算元素和的增量。...更改后的区间加法 1 void interval_add(LL ll,LL rr,LL v) 2 { 3 for(LL i=ll;i<=min(where[ll]*m,rr);i++)...i<=where[rr]-1;i++) 19 //这里where[ll]和where[rr]均已暴力处理过,所以只枚举中间的块就可以 20 add[i]+=v; 21 } 区间查询...60 61 for(LL i=1;i<=q;i++) 62 { 63 scanf("%lld",&how); 64 if(how==1)// 区间

93760

区间查找

给定一个排序数组nums(nums中有重复元素)与目标值target,如果 target在nums里出现,则返回target所在区间的左右端点下标,[左端点, 右端 点],如果target在nums里未出现...2.若无法同时求出区间左右端点,将对目标target的二分查找 增加怎样的限制条件,就可分别求出目标target所在区间 的左端点与右端点?...算法设计 查找区间左端点时,增加如下限制条件: 当target == nums[mid]时,若此时mid == 0或nums[mid-1] < target,则说明mid即 为区间左端点,返回;否则设置区间右端点为...查找区间右端点时,增加如下限制条件: 当target == nums[mid]时,若此时mid == nums.size() – 1或 nums[mid + 1] > target ,则说明mid即为区间右端点...;否则设置区间左端点为mid + 1 ?

57120

插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。...互不重叠的前提下,当我们需要插入一个新的区间 时,我们只需要: 找出所有与区间 重叠的区间集合 ; 将 中的所有区间连带上区间 合并成一个大区间; 最终的答案即为不与 重叠的区间以及合并后的大区间。...这样做的正确性在于,给定的区间集合中任意两个区间都是没有交集的,因此所有需要合并的区间,就是所有与区间 重叠的区间。...并且,在给定的区间集合已经按照左端点排序的前提下,所有与区间 重叠的区间在数组 中下标范围是连续的,因此我们可以对所有的区间进行一次遍历,就可以找到这个连续的下标范围。...那么我们应当在什么时候将区间 加入答案呢?由于我们需要保证答案也是按照左端点排序的,因此当我们遇到第一个 满足 的区间时,说明以后遍历到的区间不会与 重叠,并且它们左端点一定会大于 的左端点。

12921
领券