本篇博客会讲解力扣“228. 汇总区间”的解题思路,这是题目链接。
解题思路:使用left和right来维护有序区间的左右端点。一开始,left和right都初始化为0。注意,不能把right初始化成1,因为当数组只有1个元素时,right==1是无法进入循环的。
我们使用[left, right)作为区间。若left==right,此时区间内没有数字,需要++right。当区间内有数字时,right是区间外的第一个数字,需要和区间内的最后一个数字(下标是right-1)进行比较,如果刚好是相邻的数字,则继续++right。当我们把对应的区间输出成字符串之后,需要使right成为新的左端点。
输出字符串时,可以使用sprintf库函数,使用pos来维护输出到字符串中的位置。当区间的数字多于1个时,还需要输出右端点。输出到字符串之后,还需要把字符串存到字符串数组中去。
char ** summaryRanges(int* nums, int numsSize, int* returnSize){
// 字符串数组,字符串数量不超过nums数组的元素个数
char** ret = (char**)malloc(sizeof(char*) * numsSize);
// 记录有效字符串的个数
*returnSize = 0;
// 维护区间
int left = 0;
int right = 0;
while (right < numsSize)
{
// 找到区间的右断点
if (left == right)
{
++right;
}
while (right < numsSize && nums[right-1] + 1 == nums[right])
{
++right;
}
// 输出[left, right-1)
char* s = (char*)malloc(sizeof(char) * 25);
// 维护输出到字符串中的位置
int pos = 0;
pos += sprintf(s, "%d", nums[left]);
// 区间的数字多于1个
if (left + 1 < right)
{
pos += sprintf(s + pos, "->");
sprintf(s + pos, "%d", nums[right - 1]);
}
// 写入到字符串数组
ret[(*returnSize)++] = s;
// 迭代
left = right;
}
return ret;
}
总结
- 使用left和right维护区间。
- 使用sprintf来输出字符串。
感谢大家的阅读!