228.汇总区间

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),主要用于存储结果列表,最坏情况下每个数字都单独构成一个区间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请向我看齐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值