leetcode 面试经典 150 题:汇总区间

链接 汇总区间
题序号 228
题型 数组
解法 一次遍历法
难度 简单
熟练度 ✅✅✅

题目

给定一个 无重复元素有序 整数数组 nums 。

返回 恰好覆盖数组中所有数字最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。

列表中的每个区间范围 [a,b] 应该按如下格式输出:

"a->b" ,如果 a != b

"a" ,如果 a == b

示例 1

输入:nums = [0,1,2,4,5,7]

输出:["0->2","4->5","7"]

解释:区间范围是:

0,2\] --\> "0-\>2" \[4,5\] --\> "4-\>5" \[7,7\] --\> "7" **示例 2** : 输入:nums = \[0,2,3,4,6,8,9

输出:["0","2->4","6","8->9"]

解释:区间范围是:

0,0\] --\> "0" \[2,4\] --\> "2-\>4" \[6,6\] --\> "6" \[8,9\] --\> "8-\>9" **提示** : 0 \<= nums.length \<= 20 -2^31^ \<= nums\[i\] \<= 2^31^ - 1 nums 中的所有值都 **互不相同** nums 按升序排列 ## 题解 1. **核心思想** : * 遍历:遍历排序后的数组,记录每个连续区间的起始和结束位置。 * 处理区间:在遍历过程中,如果当前元素与前一个元素不连续(即当前元素 - 前一个元素 \> 1),则表示一个区间的结束,记录该区间并开始新的区间。 * 生成结果:将记录的区间转换为字符串格式,添加到结果列表中 2. **复杂度**:时间复杂度 O(n),其中 n 为数组的长度;空间复杂度 O(1),除了用于输出的空间外,额外使用的空间为常数。 3. **to_string 函数**:该函数用于将各种数据类型转换为字符串。它定义在 头文件中,可以处理多种数据类型,包括整数、浮点数等。 4. **c++ 实现算法**: ```cpp vector summaryRanges(vector& nums) { vector result; //初始化结果容器 int n = nums.size(); if (n == 0) return result; //数据为空,直接返回空结果 int start = 0; // 起始位置 // 遍历该数组 for (int i = 1; i <= n; ++i) { // 检查是否到了数组末尾或非连续元素 //nums[i] != nums[i - 1] + 1:当前元素与前一个元素不连续,进入 if 条件判断中。 if (i == n || nums[i] != nums[i - 1] + 1) { if (start == i - 1) { // 单个元素 //将单个元素转换成字符串形式放到容器中 //to_string 函数是 C++ 标准库中的一个函数,用于将数值(整数或浮点数)转换为对应的 // 字符串格式。它是 C++11 引入的一部分,定义在 头文件中。 result.push_back(to_string(nums[start])); } else { // 区间范围 //将当前区间 [nums[start], nums[i-1]] 转化为 "start->end" 的字符串形式添加到结果。 result.push_back(to_string(nums[start]) + "->" + to_string(nums[i - 1])); } start = i; // 更新新的起点,表示一个新的区间开始位置 } } return result; } ``` 4. **算法推演** : 输入:{0, 1, 2, 4, 5, 7} | i | nums\[i\] | start | 判断条件 | 操作 | result | |---|-----------|-------|------------------|-----------------------|---------------------------| | 1 | 1 | 0 | 连续 (1 == 0 + 1) | 不进入 if | \[ \] | | 2 | 2 | 0 | 连续 (2 == 1 + 1) | 不进入 if | \[ \] | | 3 | 4 | 0 | 不连续 (4 != 2 + 1) | 进入 if | \["0-\>2"\] | | 4 | 5 | 3 | 连续 (4 == 4 + 1) | 不进入 if | \["0-\>2"\] | | 5 | 7 | 3 | 不连续 (7 != 5 + 1) | 进入 if | \["0-\>2", "4-\>5"\] | | 6 | 超出范围 | 5 | 数组末尾(i==n) | 进入if(start==6-1),单个元素 | \["0-\>2", "4-\>5", "7"\] | 5. **c++ 完整 demo**: ```cpp #include #include #include using namespace std; vector summaryRanges(vector& nums) { vector result; //初始化结果容器 int n = nums.size(); if (n == 0) return result; //数据为空,直接返回空结果 int start = 0; // 起始位置 // 遍历该数组 for (int i = 1; i <= n; ++i) { // 检查是否到了数组末尾或非连续元素 //nums[i] != nums[i - 1] + 1:当前元素与前一个元素不连续,进入 if 条件判断中。 if (i == n || nums[i] != nums[i - 1] + 1) { if (start == i - 1) { // 单个元素 //将单个元素转换成字符串形式放到容器中 //to_string 函数是 C++ 标准库中的一个函数,用于将数值(整数或浮点数)转换为对应的 // 字符串格式。它是 C++11 引入的一部分,定义在 头文件中。 result.push_back(to_string(nums[start])); } else { // 区间范围 //将当前区间 [nums[start], nums[i-1]] 转化为 "start->end" 的字符串形式添加到结果。 result.push_back(to_string(nums[start]) + "->" + to_string(nums[i - 1])); } start = i; // 更新新的起点,表示一个新的区间开始位置 } } return result; } // 测试代码 int main() { vector nums = {0, 1, 2, 4, 5, 7}; vector result = summaryRanges(nums); for (const string& range : result) { cout << range << " "; } return 0; } ```

相关推荐
穷儒公羊6 分钟前
第二章 设计模式故事会之策略模式:魔王城里的勇者传说
python·程序人生·设计模式·面试·跳槽·策略模式·设计规范
似水流年流不尽思念15 分钟前
Spring Bean有哪些生命周期回调方法?有哪几种实现方式?
后端·spring·面试
uhakadotcom1 小时前
如何安装和使用开源的Meilisearch
后端·面试·github
在未来等你1 小时前
RabbitMQ面试精讲 Day 27:常见故障排查与分析
中间件·面试·消息队列·rabbitmq
小xin过拟合2 小时前
day20 二叉树part7
开发语言·数据结构·c++·笔记·算法
nonono2 小时前
数据结构——线性表(链表,力扣中等篇,技巧型)
数据结构·leetcode·链表
lxmyzzs3 小时前
【图像算法 - 23】工业应用:基于深度学习YOLO12与OpenCV的仪器仪表智能识别系统
人工智能·深度学习·opencv·算法·计算机视觉·图像算法·仪器仪表识别
Learn Beyond Limits3 小时前
Multi-output Classification and Multi-label Classification|多输出分类和多标签分类
人工智能·深度学习·神经网络·算法·机器学习·分类·吴恩达
张较瘦_3 小时前
[论文阅读] 软件工程 | GPS算法:用“路径摘要”当向导,软件模型检测从此告别“瞎找bug”
论文阅读·算法·bug
绝无仅有3 小时前
使用 Docker、Jenkins、Harbor 和 GitLab 构建 CI/CD 流水线
后端·面试·github