检查数组是否连贯

Submission

运行时间: 48 ms

内存: 32.2 MB

class Solution:
    def isConsecutive(self, nums: List[int]) -> bool:
        if len(nums) != len(set(nums)):
            return False
        # nums.sort()
        return min(nums) + len(nums) - 1 == max(nums)

Explain

此题解的思路是通过检查数组中的数字是否都是唯一的,并判断数组中的最小值和最大值之间是否能形成一个连续的序列。首先,通过将数组转换为集合并比较长度来检查是否有重复的数字。如果集合的长度与数组长度不同,说明数组中有重复数字,直接返回False。然后,计算如果数组是连贯的,根据最小值和数组长度应该得到的最大值(即最小值加上数组长度减一),与数组的实际最大值进行比较。如果两者相等,说明数组是连贯的,否则不是。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def isConsecutive(self, nums: List[int]) -> bool:
        if len(nums) != len(set(nums)):
            # 如果数组长度与转换为集合后的长度不相等,说明有重复的元素
            return False
        # 使用min和max函数找出数组的最小值和最大值
        # 检查最小值和最大值是否能形成一个连贯的区间
        return min(nums) + len(nums) - 1 == max(nums)

Explore

是的,此方法仍然有效。该算法核心是检查数组中的元素是否能形成一个连续的整数序列,而不考虑序列开始的具体数字是多少。无论最小值是负数、零还是正数,只要最小值和数组长度能推导出的最大值与实际最大值相符,即可判断为连贯。因此,包含负数或零不会影响算法的有效性。

该假设在数组确实由连续整数组成时总是适用的。边界情况主要发生在数组长度为1或数组中所有元素相同的情况。对于长度为1的数组,最小值加上数组长度减一等于最小值本身,仍然成立。如果数组中所有元素相同且长度大于1,则转换为集合后长度将小于原数组长度,导致算法返回False,这与题目要求的连贯性定义相符。

该逻辑在检查是否有重复元素方面是充分的。如果没有重复元素,则集合的长度和数组长度一致。但仅此并不足以确保数组是连贯的,还需验证最大值与最小值的关系是否符合连续整数序列的特征。如果最小值与最大值之间的距离不等于数组长度减一,则即使没有重复元素,数组也不是连贯的。例如,数组[1, 3, 4]转为集合后长度一致,但不是连贯的。

使用min和max函数通常需要对数组进行两次完整遍历,这在大规模数据集上可能导致性能问题。一个更优化的方法是在单次遍历中同时计算最小值和最大值。可以通过初始化两个变量,一个用于存储最小值,一个用于存储最大值,然后遍历数组一次,逐个比较更新这两个变量。这样可以将时间复杂度从O(2n)减少到O(n)。