在长度 2N 的数组中找出重复 N 次的元素

标签: 数组 哈希表

难度: Easy

给你一个整数数组 nums ,该数组具有以下属性:

  • nums.length == 2 * n.
  • nums 包含 n + 1不同的 元素
  • nums 中恰有一个元素重复 n

找出并返回重复了 n 次的那个元素。

示例 1:

输入:nums = [1,2,3,3]
输出:3

示例 2:

输入:nums = [2,1,2,5,3,2]
输出:2

示例 3:

输入:nums = [5,1,5,2,5,3,5,4]
输出:5

提示:

  • 2 <= n <= 5000
  • nums.length == 2 * n
  • 0 <= nums[i] <= 104
  • numsn + 1 不同的 元素组成,且其中一个元素恰好重复 n

Submission

运行时间: 27 ms

内存: 17.0 MB

class Solution:
    def repeatedNTimes(self, nums: List[int]) -> int:

        for i in nums:
            if nums.count(i) >1:
                return i

Explain

该题解采用的是遍历数组中的每个元素,并使用 count 方法统计该元素在数组中出现的次数。当发现某个元素的计数大于 1 时,即认为找到了重复 n 次的元素,并立即返回该元素。这种方法利用了题目的特性:数组中只有一个元素重复 n 次,其他元素均不重复。

时间复杂度: O(n^2)

空间复杂度: O(1)

class Solution:
    def repeatedNTimes(self, nums: List[int]) -> int:
        # 遍历数组中的每个元素
        for i in nums:
            # 使用count方法计算元素i在数组中的出现次数
            if nums.count(i) > 1:
                # 如果元素出现次数大于1,即找到重复n次的元素,返回该元素
                return i

Explore

题解选择使用`count`方法而不使用哈希表可能是因为`count`方法的代码实现简单直观,对于初学者来说更易于理解。此外,如果数组较小,使用`count`方法的性能损失不会特别明显。然而,这种方法在处理大数组时效率较低,因为每次调用`count`方法都需要遍历整个数组,导致整体时间复杂度较高。使用哈希表虽然能提高效率,但会稍微增加代码的复杂度。

在最坏情况下,题解中的算法的表现会非常低效。这种情况发生在需要多次调用`count`方法才能找到重复N次的元素时。例如,如果数组是`[1, 2, 3, ..., N-1, N, N]`,并且重复的元素`N`位于数组的最后位置,那么在发现重复元素之前,算法需要对每一个非重复元素执行一次完整的数组遍历。这意味着总计将执行大约`N*(N-1)/2`次比较,导致时间复杂度接近O(N^2)。

是的,使用`count`方法在数组很大时会导致明显的性能问题。因为每次调用`count`都需要遍历整个数组以计算某个元素的出现次数,这导致每次元素检查的时间复杂度为O(N)。如果多次调用`count`(例如在未立即找到重复元素的情况下),这将导致总体时间复杂度达到O(N^2)。在元素数量巨大时,这将极大地影响算法的运行效率和响应时间。

是的,省略对输入数组的长度和元素范围的检查可能在实际应用中引发问题。首先,如果输入数组的长度不是2N,那么算法的基本假设就不成立,可能导致异常或错误的结果。其次,如果元素的值超出了预期范围或数据类型限制,可能导致运行时错误。在实际应用中,良好的编程实践是对输入进行验证,确保它们符合预期的参数规格和约束,以增强程序的健壮性和可靠性。