汇总区间
· 阅读需 4 分钟
力扣面试经典——228题
💡 参考代码:
/**
* 返回恰好覆盖数组中所有数字的最小有序区间范围列表
*
* @param nums 有序整数数组(无重复元素)
* @param numsSize 数组长度
* @param returnSize 返回数组的长度
* @return 区间范围字符串数组
*/
char** summaryRanges(int* nums, int numsSize, int* returnSize) {
// 处理空数组情况
if (numsSize == 0) {
*returnSize = 0;
return NULL;
}
// 分配结果数组内存,最坏情况下每个元素都是独立区间
char** result = (char**)malloc(numsSize * sizeof(char*));
*returnSize = 0;
// 使用双指针遍历数组
int start = 0; // 当前区间的起始位置
for (int end = 0; end < numsSize; end++) {
// 如果到达数组末尾或者下一个元素不连续,则形成一个区间
if (end + 1 == numsSize || nums[end] + 1 != nums[end + 1]) {
// 分配单个结果字符串内存
result[*returnSize] = (char*)malloc(25 * sizeof(char)); // 足够存储两个int和"->"
// 根据区间长度决定输出格式
if (start == end) {
// 单个元素区间
sprintf(result[*returnSize], "%d", nums[start]);
} else {
// 多个元素区间
sprintf(result[*returnSize], "%d->%d", nums[start], nums[end]);
}
(*returnSize)++; // 结果计数增加
start = end + 1; // 更新下一个区间的起始位置
}
}
return result;
}
📖 总结:
点击展开题目总结
🤔 汇总区间
1️⃣ 题目核心信息
🎯 功能描述:将有序整数数组中的连续数字合并为区间表示
📥 输入输出:
- 输入:
nums- 有序整数数组(无重复元素),numsSize- 数组长度 - 输出:返回区间范围字符串数组,每个区间按照"a->b"或"a"格式表示
2️⃣ 实现原理
💡 核心思路:使用双指针技术识别连续数字区间
📋 实现步骤:
- 特殊情况处理:空数组直接返回
- 使用双指针遍历数组,start标记区间起点,end寻找区间终点
- 当发现不连续数字时,将当前区间添加到结果中
- 根据区间长度决定输出格式
3️⃣ 关键点解析
🎯 代码技巧
- 双指针法识别连续区间
- 利用
nums[end] + 1 != nums[end + 1]判断连续性 - sprintf函数格式化字符串输出
4️⃣ 使用场景
✅ 适用情况:
- 数据压缩:将连续数据合并为区间表示
- 日志分析:将连续的时间戳或ID合并显示
- 数组可视化:简化大量连续数据的展示
⚠️ 前提条件:
- 输入数组必须有序
- 数组元素不能有重复
5️⃣ 复杂度分析
- ⏱️ 时间复杂度:O(n),只需要遍历数组一次
- 💾 空间复杂度:O(1),不考虑输出数组的话只使用常数额外空间
6️⃣ 注意事项
🚩 边界情况:
- 空数组
- 单元素数组
- 所有元素都是连续的情况
💥 易错点:
- 内存分配大小计算
- 区间边界判断条件
- 字符串格式化输出
7️⃣ 补充说明
以示例 nums = [0,1,2,4,5,7] 来逐步说明代码执行过程:
-
初始化阶段:
result:分配内存用于存储结果returnSize = 0:结果计数器初始化start = 0:第一个区间的起始位置
-
第一次循环 (end=0):
- 检查
nums[0]+1 = 1是否等于nums[1] = 1→ 相等,继续
- 检查
-
第二次循环 (end=1):
- 检查
nums[1]+1 = 2是否等于nums[2] = 2→ 相等,继续
- 检查
-
第三次循环 (end=2):
- 检查
nums[2]+1 = 3是否等于nums[3] = 4→ 不相等,找到区间终点 - 当前区间为
[0,2],格式化为"0->2" result[0] = "0->2",returnSize = 1- 更新
start = 3(下一个区间的起点)
- 检查
-
第四次循环 (end=3):
- 检查
nums[3]+1 = 5是否等于nums[4] = 5→ 相等,继续
- 检查
-
第五次循环 (end=4):
- 检查
nums[4]+1 = 6是否等于nums[5] = 7→ 不相等,找到区间终点 - 当前区间为
[3,4](即[4,5]),格式化为"4->5" result[1] = "4->5",returnSize = 2- 更新
start = 5
- 检查
-
第六次循环 (end=5):
- 已到达数组末尾
- 当前区间为
[5,5](即[7,7]),格式化为"7" result[2] = "7",returnSize = 3
最终结果:["0->2","4->5","7"]
加载评论中...
