文章目录
- Tag
- 题目来源
- 题目解读
- 解题思路
- 方法一:一次遍历
- 复杂度分析
- 其他语言
- python3
- C
- 写在最后
Tag
【一次遍历】【数组】【字符串】
题目来源
228. 汇总区间
题目解读
给定一个无重复的升序数组 nums
,需要将这个数组按照以下规则进行汇总:
- 对于数组中的连续整数,比如
0, 1, 2
,输出连续区间"0->2"
; - 对于数组中的非连续整数,比如数组
[0, 1, 2, 4]
中的4
,输出单独区间"4"
。
最后输出数组nums
的汇总字符串。
解题思路
数据规模很小,时间复杂度上无需担心。
但是,数组中的数据值可能会取到int
整型数据的边界处,边界处的+-*/
计算容易越界,需要小心。比如 -2147483647 - -2147483648
就会报错。
方法一:一次遍历
从数组0
位置出发,向右遍历。使用start
指针记录连续元素的起始值,end
记录连续元素的终点值,在遍历中动态维护两个指针,在遍历过程中:
- 如果
start != end
,则输出字符串"start->end"
; - 如果
start == end
,则表明该数字不属于任何连续的区间,需要作为一个单独的区间元素输出。
实现代码
class Solution {
public:
vector<string> summaryRanges(vector<int>& nums) {
vector<string> ret;
int n = nums.size();
int start, end;
for (int i = 0; i < n;) {
start = i;
++i;
while (i < n && nums[i] == nums[i-1] + 1) {
++i;
}
end = i - 1;
string tmp = to_string(nums[start]);
if (start < end) {
tmp += "->";
tmp += to_string(nums[end]);
}
ret.push_back(tmp);
}
return ret;
}
};
复杂度分析
时间复杂度:
O
(
n
)
O(n)
O(n),
n
n
n 为数组 num
的长度。
空间复杂度: O ( 1 ) O(1) O(1),只使用了有限个变量。
其他语言
python3
class Solution:
def summaryRanges(self, nums: List[int]) -> List[str]:
res = []
i = 0
n = len(nums)
while i < n: # i 是连续的左端点
j = i # j 是连续的右端点
while j + 1 < n and nums[j+1] == nums[j] + 1:
j += 1
strs = str(nums[i]) if i == j else f'{nums[i]}->{nums[j]}'
res.append(strs)
i = j + 1
return res
C
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char ** summaryRanges(int* nums, int numsSize, int* returnSize){
char** res = malloc(sizeof(char*) * numsSize);
*returnSize = 0;
int i = 0;
while (i < numsSize) {
int low = i;
++i;
while (i < numsSize && nums[i] == nums[i-1] + 1) {
++i;
}
int high = i - 1;
char* tmp = malloc(sizeof(char) * 25);
sprintf(tmp, "%d", nums[low]);
if (low < high) {
sprintf(tmp + strlen(tmp), "->");
sprintf(tmp +strlen(tmp), "%d", nums[high]);
}
res[(*returnSize)++] = tmp;
}
return res;
}
sprintf
是一个 C 标准库函数,用于将格式化的数据写入字符串中,而不是标准输出流或文件。它的使用方式类似于 printf
,但它不会将输出写入控制台,而是将其存储在指定的字符串中。
写在最后
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。