新闻传播学论文降AI工具免费推荐:2026年新闻系毕业论文4.8元知网99.26%亲测达标
2026/5/4 17:32:27
对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎
给定一个区间的集合intervals,其中每个区间表示为[start, end],你需要合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠,合并为 [1,6]。示例 2:
输入:intervals = [[1,4],[4,5]] 输出:[[1,5]] 解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。注意:输入类型可能为数组或类似结构,输出要求有序(通常按起始点升序)。作为前端开发者,你需处理类似数组操作和数据格式化问题。
intervals,每个子数组表示一个区间,包含起始点start和结束点end。假设start <= end,且数组可能无序。[a, b]和[c, d]重叠,如果a <= d且c <= b(即一个区间的起始点小于或等于另一个区间的结束点)。合并后新区间为[min(a, c), max(b, d)]。start升序排序。merged,遍历排序后的区间:merged为空或当前区间与merged中最后一个区间不重叠(即当前区间的起始点大于最后一个区间的结束点),则将当前区间添加到merged。merged最后一个区间的结束点为当前区间结束点与最后一个区间结束点的最大值。以下用 JavaScript 实现,作为前端开发者的常用语言。
/** * @param {number[][]} intervals * @return {number[][]} */varmerge=function(intervals){if(intervals.length===0)return[];// 按起始点升序排序intervals.sort((a,b)=>a[0]-b[0]);constmerged=[];for(letintervalofintervals){// 如果 merged 为空或当前区间不重叠if(merged.length===0||merged[merged.length-1][1]<interval[0]){merged.push(interval);}else{// 合并区间:更新最后一个区间的结束点merged[merged.length-1][1]=Math.max(merged[merged.length-1][1],interval[1]);}}returnmerged;};// 测试示例console.log(merge([[1,3],[2,6],[8,10],[15,18]]));// 输出 [[1,6],[8,10],[15,18]]console.log(merge([[1,4],[4,5]]));// 输出 [[1,5]]/** * 暴力法实现合并区间 * @param {number[][]} intervals * @return {number[][]} */varmergeBruteForce=function(intervals){if(intervals.length===0)return[];letmerged=[...intervals];letchanged=true;// 重复合并直到无变化while(changed){changed=false;constnewMerged=[];for(leti=0;i<merged.length;i++){letcurrent=merged[i];letisMerged=false;for(letj=0;j<newMerged.length;j++){// 检查重叠if(current[0]<=newMerged[j][1]&&newMerged[j][0]<=current[1]){// 合并区间newMerged[j][0]=Math.min(newMerged[j][0],current[0]);newMerged[j][1]=Math.max(newMerged[j][1],current[1]);isMerged=true;changed=true;break;}}if(!isMerged){newMerged.push(current);}}merged=newMerged;}returnmerged.sort((a,b)=>a[0]-b[0]);// 确保输出有序};// 注意:暴力法效率低,仅用于小数据测试console.log(mergeBruteForce([[1,3],[2,6],[8,10],[15,18]]));// 输出类似结果| 思路 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| 排序后合并 | O(n log n) | O(log n) 或 O(n) | 高效,代码简洁,易于维护 | 依赖排序,可能修改原数组 | 大多数前端应用,如事件合并、数据可视化 |
| 暴力法 | O(n²) | O(n) | 实现简单,易于理解 | 效率低,不适用于大数据 | 小数据集学习或原型开发 |
作为前端开发者,掌握合并区间算法可应用于以下场景: