解法:
设置两个指针,i指向数组当前元素,prev指向虚拟的连续range中的元素。初始化prev为lower - 1,i为0。若i位置的数组元素比prev只大1,说明连续range中下一个数字与数组中当前i位置数字相同,进入下一个循环即可,如果不只大1,则说明数组中有当前元素较上一个i位置有不连续,则向output中添加一个字符串。让prev取i的上一个位置,可避免多次对i是否合法的判断。
Python源码:
Runtime: 12 ms, faster than 86.18% of Python online submissions forMissing Ranges.
Memory Usage: 11.8 MB, less than 33.33% of Python online submissions for Missing Ranges.
class Solution(object):
def findMissingRanges(self, nums, lower, upper):
"""
:type nums: List[int]
:type lower: int
:type upper: int
:rtype: List[str]
"""
prev = lower - 1
output = []
for i in range(len(nums) + 1):
if i == len(nums):
curr = upper + 1
else:
curr = nums[i]
if curr - prev >= 2:
output.append(self.get_range(prev + 1, curr - 1))
prev = curr
return output
def get_range(self, left, right):
if left == right:
return str(left)
else:
return str(left)+'->'+str(right)
我的心路:
现在已经很习惯用指针而非逐个遍历来代替针对列表或字符串的编码实现。中间没有想到的情况是列表中重复的元素,和lower,upper的相等情况。
虽然思路一样,但推荐解法的实现方式比我简洁得多。
Runtime: 16 ms, faster than 68.90% of Python online submissions forMissing Ranges.
Memory Usage: 11.8 MB, less than 33.33% of Python online submissions for Missing Ranges.
class Solution(object):
def findMissingRanges(self, nums, lower, upper):
"""
:type nums: List[int]
:type lower: int
:type upper: int
:rtype: List[str]
"""
if len(nums) < 1:
return [self.generate_str(lower, upper + 1)]
output = []
j = 0
while j <= len(nums) - 1:
while j <= len(nums) - 1 and lower == nums[j]:
lower += 1
j += 1
while j <= len(nums) - 1 and lower > nums[j]:
j += 1
if j <= len(nums) - 1:
output.append(self.generate_str(lower, nums[j]))
lower = nums[j] + 1
j += 1
if upper > nums[-1]:
output.append(self.generate_str(nums[-1] + 1, upper + 1))
return output
def generate_str(self, left, right):
sub = right - left
if sub > 1:
return str(left)+'->'+str(right - 1)
elif sub == 1 or sub == 0:
return str(left)