1. 题号和题目名称
228.汇总区间
2. 题目叙述
给定一个无重复元素的有序整数数组 nums 。
返回恰好覆盖数组中所有数字的最小有序区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [a,b] 应该按如下格式输出:
- 若
a != b:"a->b" - 若
a == b:"a"
3. 模式识别
本题是一个数组遍历问题,需要对有序数组进行线性扫描,找出连续的数字区间。
4. 考点分析
- 数组的遍历和操作。
- 字符串的处理,需要将区间信息转换为字符串格式。
- 边界条件的处理,如数组为空或者只有一个元素的情况。
5. 所有解法
- 遍历法:遍历数组,记录连续数字的起始和结束位置,当数字不连续时,将当前区间添加到结果列表中,并更新起始位置。
6. 最优解法(遍历法)的C语言代码
/** use ->
* Note: The returned array must be malloced, assume caller calls free().
*/
char** summaryRanges(int* nums, int numsSize, int* returnSize) {
int *left = NULL, *right = NULL; // 设置左右区间捕捉指针
int i = 0, left_sub = 0, right_sub = 0; // 用于数组轮询,左右指针下标
char **return_arr = (char **)malloc(sizeof(char *) * numsSize);
*returnSize = 0;
if(NULL == return_arr)
{
printf("open space error!");
exit(0);
}
while(i < numsSize)
{
right = NULL; // 初始化双区间
left = NULL;
if(NULL == left)
{
left = &nums[i]; // 记录左值开始寻找右值
left_sub = i;
right_sub = i;
while(i < numsSize - 1 && nums[i] + 1 == nums[i + 1])
{
right = &nums[i + 1];
i++;
right_sub = i; // 更新右坐标
}
}
return_arr[(*returnSize)] = (char *)calloc(100, sizeof(char)); // 开辟一片足够容纳字符串的空间
if(NULL == return_arr[(*returnSize)])
{
printf("open space error!");
exit(0);
}
if(NULL == right) // 放入数据
{
sprintf(return_arr[(*returnSize)], "%d",*left);
}
else
{
sprintf(return_arr[(*returnSize)], "%d->%d", *left, *right);
}
(*returnSize)++;
i++;
}
return return_arr;
}
7. 复杂度分析
- 时间复杂度:O(n)O(n)O(n),其中 nnn 是数组的长度。因为只需要遍历一次数组。
- 空间复杂度:O(n)O(n)O(n),主要用于存储结果列表,最坏情况下每个数字都单独构成一个区间。

362

被折叠的 条评论
为什么被折叠?



