【问题标题】:Contains Duplicate II包含副本 II
【发布时间】:2019-03-30 02:59:19
【问题描述】:

给定一个整数数组和一个整数 k,找出数组中是否有两个不同的索引 i 和 j 使得 nums[i] = nums[j] 并且 i 和 j 之间的绝对差最多为 k .

示例 1:

Input: nums = [1,2,3,1], k = 3
Output: true

示例 2:

Input: nums = [1,0,1,1], k = 1
Output: true

示例 3:

Input: nums = [1,2,3,1,2,3], k = 2
Output: false

这是我的代码:

class Solution(object):
def containsNearbyDuplicate(self, nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: bool
    """
    def helper(lnums, n):
        if len(lnums) == 0 and n == 0:
            return False
        elif len(lnums) > n:
            for i in lnums[1:n]:
                if i == lnums[0]:
                    return True
            lnums.pop(0)
            return helper(lnums, n)
        else:
            return False

    return helper(nums, k)

谁能指出我为什么做错了???我知道 elif 有问题。但我不知道为什么这不起作用。

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

    一些小调整使其工作:

    def helper(lnums, n):
        if len(lnums) == 0 or n == 0:  # note: or, not and
            return False
        else:   # there do NOT have to be at least n elements, why would there?
            for i in lnums[1:n+1]:  # exclusive upper slice boundary -> n+1
                if i == lnums[0]:
                    return True
            lnums.pop(0)
            return helper(lnums, n)
    

    或者没有昂贵的弹出和递归,使用一些像anyenumerate这样的好工具:

    def helper(lnums, n):
        return any(x in lnums[i+1:i+1+n] for i, x in enumerate(lnums))
    

    【讨论】:

    • 如果 lnums 有 2 个对象,但是 n = 3,那么 lnums[1:n+1] 会超出范围吗???我不明白它为什么起作用。
    • Python 切片没有越界:参见例如stackoverflow.com/questions/22951107/…。仍然nums=[1,1], k=3 应该返回True,所以必须考虑这些长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2021-07-03
    • 1970-01-01
    • 2012-01-21
    • 2018-10-12
    • 1970-01-01
    相关资源
    最近更新 更多