【练习】力扣 热题100 合并区间

题目

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 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] 可被视为重叠区间。

来源:力扣 热题100 合并区间
——————————————————————

1. 代码分析

目标
  • 给定一个区间的集合,合并所有重叠的区间。
实现思路
  1. 排序:首先将所有区间按照起始点进行排序。
  2. 合并:遍历排序后的区间,逐个检查当前区间是否与结果集中的最后一个区间重叠。
    • 如果重叠,则合并当前区间与结果集中的最后一个区间。
    • 如果不重叠,则将当前区间加入结果集。

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        // 处理空输入的情况
        if (intervals.empty()) return {};

        // 按区间的起始点排序
        sort(intervals.begin(), intervals.end());

        vector<vector<int>> merged;
        merged.emplace_back(intervals[0]); // 将第一个区间加入结果集

        // 遍历区间
        for (int i = 1; i < intervals.size(); i++) {
            // 如果当前区间与结果集的最后一个区间重叠
            if (intervals[i][0] <= merged.back()[1]) {
                // 合并区间
                merged.back()[1] = max(merged.back()[1], intervals[i][1]);
            } else {
                // 否则,将当前区间加入结果集
                merged.emplace_back(intervals[i]);
            }
        }

        return merged;
    }
};

2. 示例运行

输入:

vector<vector<int>> intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
Solution solution;
vector<vector<int>> result = solution.merge(intervals);

输出:

{{1, 6}, {8, 10}, {15, 18}}

解释:

  • 区间 [1, 3][2, 6] 重叠,合并为 [1, 6]
  • 区间 [8, 10][15, 18] 不重叠,保持不变。

3.时间分析

在这里插入图片描述
你的代码已经是一个高效的实现,时间复杂度为 O(N log N),空间复杂度为 O(N),这是区间合并问题的标准解法。不过,仍有一些小的优化和改进空间,主要集中在代码的可读性、简洁性和性能的细微提升上。

以下是优化后的代码和详细解释:


优化后的代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.empty()) return {};

        // 按区间的起始点排序
        sort(intervals.begin(), intervals.end());

        vector<vector<int>> merged;
        merged.reserve(intervals.size()); // 预分配空间,避免多次动态扩容

        for (const auto& interval : intervals) {
            // 如果结果集为空,或者当前区间与结果集的最后一个区间不重叠
            if (merged.empty() || merged.back()[1] < interval[0]) {
                merged.push_back(interval); // 直接插入当前区间
            } else {
                // 否则,合并当前区间与结果集的最后一个区间
                merged.back()[1] = max(merged.back()[1], interval[1]);
            }
        }

        return merged;
    }
};

优化点详解

1. 预分配空间
  • 使用 merged.reserve(intervals.size()) 预分配结果集的空间,避免在插入元素时多次动态扩容,从而提高性能。
  • 虽然时间复杂度不变,但可以减少内存分配的开销。
2. 使用 const auto& 遍历
  • 使用 for (const auto& interval : intervals) 遍历区间,避免拷贝区间对象,提高性能。
  • const auto& 是 C++ 中遍历容器的推荐写法。
3. 简化逻辑
  • if (intervals[i][0] <= merged.back()[1]) 改为 if (merged.empty() || merged.back()[1] < interval[0]),逻辑更加直观。
  • 如果结果集为空,或者当前区间与结果集的最后一个区间不重叠,则直接插入当前区间;否则,合并区间。

进一步优化(如果需要)

如果输入数据有特殊性质(例如区间已经部分有序),可以考虑以下优化:

1. 自定义排序
  • 如果区间已经部分有序,可以使用更高效的排序算法(如插入排序)来优化排序过程。
2. 并行化
  • 如果数据量非常大,可以考虑将排序和合并过程并行化,利用多核 CPU 提高性能。
3. 原地合并
  • 如果允许修改输入数组,可以尝试原地合并区间,减少空间复杂度。不过,这会增加代码的复杂性。

总结

优化后的代码在保持原有逻辑的基础上,通过预分配空间、使用 const auto& 遍历和简化逻辑,进一步提升了代码的性能和可读性。
在这里插入图片描述

<think>嗯,用户想要整合力扣算法中的英语算法词汇。首先,我需要确定用户的需求是什么。可能用户正在准备面试或者刷,需要熟悉常见的英语算法术语,方便阅读目或者国际交流。 接下来,我得回忆一下力扣上常见的算法类型,比如数组、链表、树、图这些数据结构相关的目。然后每个数据结构下常用的算法,比如数组里的双指针、滑动窗口;树里的遍历方式,DFS、BFS等等。 另外,动态规划、贪心算法这些高频考点肯定不能少。还有一些特定的算法名称,比如Dijkstra算法、KMP算法,这些都是经常出现的英语词汇。 然后要考虑用户可能需要中英文对照,这样他们看到英文术语时能对应到中文概念。比如Binary Search对应二分查找,Backtracking对应回溯算法。 还要注意一些容易混淆的术语,比如“Topological Sort”是拓扑排序,“Sliding Window”是滑动窗口,这些需要准确对应。另外,排序算法里的Quick Sort、Merge Sort,查找算法里的BFS、DFS,都是必须包括的。 可能用户还需要了解一些特定的问名称,比如Two Sum(两数之和)或者N-Queens(N皇后问),这些目在力扣上非常经典,英语名称也经常被提到。 需要确保覆盖全面,分门别类,比如数据结构、算法分类、经典问、技术概念等,这样用户查阅起来更方便。同时,每个类别下举出足够的例子,帮助用户记忆和理解。 最后,检查是否有遗漏的重要术语,比如最近比较门的算法或者新加入力扣目相关词汇。确保信息准确,没有拼写错误,比如Dijkstra的正确拼写,以及各种算法名称的首字母大写。 总结一下,应该分成几个大类,每个类别下列出中英文对照,并简要说明应用场景或例子,这样用户能快速查找和复习。同时,提醒用户结合练习来巩固这些术语,这样效果会更好。</think>### 力扣算法高频英语词汇整合(中英对照) --- #### **一、数据结构相关** | **英文术语** | **中文翻译** | **典型应用场景/示例** | |----------------------|--------------------|-------------------------------------| | Array | 数组 | Two Sum, Majority Element | | Linked List | 链表 | Reverse Linked List, Merge Two Lists | | Stack | 栈 | Valid Parentheses, Min Stack | | Queue | 队列 | BFS, Sliding Window Maximum | | Tree | 树 | Binary Tree Traversal, BST Validation | | Graph | 图 | Shortest Path, Topological Sorting | | Heap/Priority Queue | 堆/优先队列 | Merge k Sorted Lists, Top K Elements | | Hash Table | 哈希表 | Subarray Sum, Two Sum | | Trie | 字典树 | Word Search, Autocomplete System | --- #### **二、算法分类** | **英文术语** | **中文翻译** | **典型目** | |---------------------------|----------------------|---------------------------------------| | Two Pointers | 双指针 | Container With Most Water, 3Sum | | Sliding Window | 滑动窗口 | Longest Substring Without Repeating Characters | | Binary Search | 二分查找 | Search in Rotated Sorted Array | | Depth-First Search (DFS) | 深度优先搜索 | Permutations, N-Queens | | Breadth-First Search (BFS)| 广度优先搜索 | Word Ladder, Level Order Traversal | | Dynamic Programming (DP) | 动态规划 | Climbing Stairs, Longest Common Subsequence | | Backtracking | 回溯算法 | Subsets, Sudoku Solver | | Greedy Algorithm | 贪心算法 | Jump Game, Task Scheduler | | Divide and Conquer | 分治法 | Merge Sort, Maximum Subarray | | Topological Sorting | 拓扑排序 | Course Schedule, Alien Dictionary | --- #### **三、经典问名称** | **英文目名** | **中文翻译** | **核心考点** | |-------------------------------|---------------------------|---------------------------------------| | Two Sum | 两数之和 | 哈希表、双指针 | | Merge Intervals | 合并区间 | 排序、区间操作 | | Trapping Rain Water | 接雨水 | 双指针、动态规划 | | Longest Palindromic Substring | 最长回文子串 | 中心扩展法、动态规划 | | N-Queens | N皇后问 | 回溯算法 | | Word Break | 单词拆分 | 动态规划 | | Edit Distance | 编辑距离 | 动态规划 | | Knapsack Problem | 背包问 | 动态规划 | | Dijkstra's Algorithm | 迪杰斯特拉算法 | 最短路径(带权图) | | Kruskal's Algorithm | 克鲁斯卡尔算法 | 最小生成树 | --- #### **四、技术概念与函数** | **英文术语** | **中文翻译** | **说明** | |---------------------------|----------------------|---------------------------------------| | Time Complexity | 时间复杂度 | $O(n), O(n \log n)$ | | Space Complexity | 空间复杂度 | $O(1), O(n)$ | | Recursion | 递归 | 函数调用自身 | | Memoization | 记忆化 | 缓存中间结果(如DP) | | Edge Case | 边界条件 | 输入为0、空、极值等场景 | | In-place Algorithm | 原地算法 | 不占用额外空间(如数组翻转) | --- #### **五、常见操作** | **英文术语** | **中文翻译** | **示例** | |---------------------------|----------------------|---------------------------------------| | Swap | 交换元素 | Swap two nodes in a linked list | | Reverse | 反转 | Reverse a string or linked list | | Merge | 合并 | Merge two sorted arrays | | Rotate | 旋转 | Rotate an array by k steps | | Traversal | 遍历 | In-order traversal of a binary tree | --- #### **六、高频技巧** - **Sentinel Node**(哑节点):用于简化链表操作(如删除头节点)。 - **Fast & Slow Pointers**(快慢指针):检测链表环、找中点。 - **Prefix Sum**(前缀和):快速计算子数组和(如Subarray Sum Equals K)。 - **Bit Manipulation**(位运算):异或、掩码操作(如Single Number)。 --- #### **七、学习建议** 1. **结合目理解术语**:通过具体目(如Two Sum)反推算法词汇。 2. **分类记忆**:按数据结构、算法类型整理词汇表。 3. **对比相似概念**:如BFS vs DFS,DP vs Greedy。 4. **刷时标注术语**:在代码注释或笔记中标记对应英文词汇。 如果需要进一步细化某个分类的词汇或示例,可以告诉我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值