【LeetCode】163. Missing Ranges

32 篇文章 0 订阅
32 篇文章 0 订阅

LeetCode163 传送门

解法:

    设置两个指针,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)
            
                

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值