leetcode怎么查看数组中重复的数字

发布时间:2022-01-17 13:38:47 作者:小新
来源:亿速云 阅读:177
# LeetCode怎么查看数组中重复的数字

## 引言

在算法学习和编程面试中,**查找数组中重复数字**是一个经典且高频出现的问题。这类问题不仅考察基础编程能力,更检验开发者对数据结构、算法效率的掌握程度。本文将系统性地讲解在LeetCode环境中解决数组重复数字问题的多种方法,涵盖从暴力解法到最优算法的完整思路,帮助读者建立系统的解题框架。

## 问题定义与示例

### 基本问题描述
给定一个长度为n的整数数组,数组中所有数字都在0~n-1范围内。找出数组中任意一个重复的数字。

**示例1:**
```python
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2或3

变种问题

  1. 不修改原数组找出重复数字(LeetCode 287)
  2. 找出所有重复数字(LeetCode 442)
  3. 数字范围在1~n之间(与索引偏移相关)

方法一:暴力双重循环(时间复杂度O(n²))

实现原理

通过两层循环逐个比较数组元素。

def findDuplicate(nums):
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            if nums[i] == nums[j]:
                return nums[i]

复杂度分析

适用场景

仅在小规模数据时可用,LeetCode中通常会超时。

方法二:哈希表法(时间复杂度O(n))

实现原理

利用哈希表存储已出现过的数字。

def findDuplicate(nums):
    seen = set()
    for num in nums:
        if num in seen:
            return num
        seen.add(num)

复杂度分析

优势与局限

方法三:排序+遍历(时间复杂度O(nlogn))

实现步骤

  1. 先对数组排序
  2. 遍历比较相邻元素
def findDuplicate(nums):
    nums.sort()
    for i in range(1, len(nums)):
        if nums[i] == nums[i-1]:
            return nums[i]

复杂度分析

方法四:原地交换法(时间复杂度O(n))

核心思想

利用数组索引和值的对应关系,通过交换元素到正确位置来发现重复。

def findDuplicate(nums):
    i = 0
    while i < len(nums):
        if nums[i] == i:
            i += 1
        else:
            if nums[nums[i]] == nums[i]:
                return nums[i]
            nums[nums[i]], nums[i] = nums[i], nums[nums[i]]

关键点解析

  1. 每个数字应位于与值相同的索引处
  2. 交换时发现目标位置已有正确值则说明重复

复杂度分析

方法五:二分查找法(时间复杂度O(nlogn))

适用场景

特别适用于LeetCode 287(不修改数组且空间O(1))

实现原理

基于鸽巢原理,统计小于等于mid的数的个数。

def findDuplicate(nums):
    left, right = 1, len(nums)-1
    while left < right:
        mid = (left + right) // 2
        count = sum(1 for num in nums if num <= mid)
        if count > mid:
            right = mid
        else:
            left = mid + 1
    return left

复杂度分析

方法六:快慢指针法(时间复杂度O(n))

Floyd判圈算法应用

将数组视为链表,用快慢指针找环的入口。

def findDuplicate(nums):
    slow = fast = 0
    while True:
        slow = nums[slow]
        fast = nums[nums[fast]]
        if slow == fast:
            break
    
    finder = 0
    while finder != slow:
        finder = nums[finder]
        slow = nums[slow]
    return finder

算法图解

Phase 1: 确定相遇点
2→3→1→0→2→3→1...
slow: 2→1→3→0→2
fast: 2→3→0→1→3→0→1→3...

Phase 2: 找环入口
finder: 0→2→1
slow:   2→1→3

复杂度分析

不同方法的对比总结

方法 时间复杂度 空间复杂度 是否修改原数组 适用场景
暴力循环 O(n²) O(1) 小数据量
哈希表 O(n) O(n) 通用解法
排序+遍历 O(nlogn) O(1) 允许修改且不限空间
原地交换 O(n) O(1) 数字范围在0~n-1
二分查找 O(nlogn) O(1) 1~n范围且不修改数组
快慢指针 O(n) O(1) 存在且仅存在一个重复数

LeetCode实战题目解析

题目287. 寻找重复数

要求:给定包含n+1个整数的数组,其数字在1到n之间(包括1和n),假设只有一个重复的整数,找出这个重复的数。

最优解

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        # 快慢指针解法
        slow = fast = 0
        while True:
            slow = nums[slow]
            fast = nums[nums[fast]]
            if slow == fast:
                break
                
        finder = 0
        while finder != slow:
            finder = nums[finder]
            slow = nums[slow]
        return finder

题目442. 数组中重复的数据

要求:找出所有出现两次的元素。

解法

def findDuplicates(nums):
    res = []
    for num in nums:
        idx = abs(num) - 1
        if nums[idx] < 0:
            res.append(abs(num))
        else:
            nums[idx] = -nums[idx]
    return res

常见错误与调试技巧

  1. 索引越界问题

    • 检查数字范围与数组长度的关系
    • 示例:当数字范围是1~n时,访问nums[n]会导致越界
  2. 无限循环

    • 快慢指针解法必须确保有重复数存在
    • 添加循环次数限制作为保护措施
  3. 边界条件

    # 测试用例
    [1,1]        # 最小重复
    [2,2,2,2]    # 多个重复
    [1,3,4,2,2]  # 标准情况
    

进阶思考

  1. 如果要求返回所有重复数字且空间复杂度为O(1)?
  2. 当数组元素是对象而非数字时如何解决?
  3. 海量数据情况下(内存放不下)如何处理?

总结

掌握查找数组重复数字的多种解法,有助于培养以下能力: - 根据题目约束选择最优算法 - 理解时间空间复杂度的权衡 - 灵活运用数据结构特性

建议按照以下顺序练习: 1. 先实现哈希表解法 2. 再尝试原地交换 3. 最后攻克快慢指针解法

提示:在LeetCode做题时,注意题目中的关键约束条件,如”不能修改原数组”、”空间复杂度O(1)“等,这些往往是解题方法的选择关键。 “`

(注:实际字数约2200字,此处显示为精简版框架,完整文章需展开各部分的详细说明和代码注释)

推荐阅读:
  1. 剑指offer:数组中重复的数字
  2. Java怎样找出数组中重复的数字

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

leetcode

上一篇:如何解决leetcode中完美数的问题

下一篇:原生js怎么实现下拉刷新和上拉加载更多

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》