"The only place where success comes before work is in the dictionary." - Vidal Sassoon
1. 题目描述
2. 题目分析与解析
2.1 思路一
因为题目提示了我们数组是有序的,而覆盖区间都是根据数组中连续数字来确定的,比如:
可以知道因为数组nums中有 {0,1,2}
所以对应了区间“0-2”,同理 {4,5}
对应了“4-5”,对于单独的 {7}
,对应单独区间“7”。可以发现,区间范围都是那些连续数字的头尾组成的,也就是他们之间相差1。因此根据以上性质,我们就可以写出如下:
代码思路:
-
初始化结果集与头部变量
-
遍历数组nums
-
对于当前数字的前一个数字不是当前
数字 - 1
的值,那么说明当前数字为一个新的区间的头,同时上一个区间的尾部也可以确定就是当前数字的上一个数字。(nums的首个元素肯定是一个区间的头部) -
将求得的区间存入结果集
-
返回结果集
3. 代码实现
3.1 思路一
4. 相关复杂度分析
时间复杂度
-
遍历数组:这段代码主要通过一次遍历(for循环)来处理数组
nums
。在这个过程中,每个元素都被访问一次来确定它是否属于一个新的区间或者是当前区间的延续。 -
操作简化:在每次迭代中,进行的是常数时间的操作,包括比较、赋值、以及在列表
ret
中添加元素。
因此,时间复杂度主要取决于输入数组nums
的长度n
。遍历数组的时间复杂度是O(n)。
空间复杂度
-
结果存储:使用了一个
ArrayList
来存储结果字符串,其大小取决于输入数组中连续区间的数量。在最坏的情况下(即数组中没有任何连续的元素),这个列表的大小将与输入数组的大小相同。 -
临时变量:使用了一些固定空间的临时变量,如
head
,和循环变量i
,但这些不随输入规模增长。
因此,空间复杂度主要取决于结果列表ret
的大小。在最坏情况下,这个列表中的元素数量与输入数组nums
的元素数量相同,因此空间复杂度为O(n)。
总结:
-
时间复杂度:O(n)
-
空间复杂度:O(n)
今天还会更一篇~~~