zoukankan      html  css  js  c++  java
  • 剑指Offer 03. 数组中重复的数字

    题目描述:

          在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有哪几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

    示例1:

    输入:
    [2, 3, 1, 0, 2, 5, 3]
    输出:
    2或3
    

     题解:

          这个题目的解法有多种,最容易想到的就是暴力法,用双重循环去遍历数组,如果找到相等的两个数,则返回。这种解法虽然很容易想到,但是算法的时间复杂度为 O(n^2),显然算法效率很低下,在这道题目里面,如果按照这样的思路求解会出现超时的错误。下面是双重循环实现的代码。

    class Solution:
        def findRepeatNumber(self, nums: List[int]) -> int:
            n = len(nums)
            for i in range(n):
                for j in range(i+1,n):
                    if nums[i] == nums[j]:
                        return nums[i]
    

           另一种方法是用一个空的集合来存放这些数字,然后去遍历数组,如果当前的数字在集合里面,则返回这个数字,即它就是我们要求的重复的数字,如果不在集合里面,则把它添加进去。这样做只需要进行一次遍历即可,算法的时间复杂度为 O(n)。

    class Solution:
        def findRepeatNumber(self, nums: List[int]) -> int:
            dic = set()
            for num in nums:
                if num in dic:
                    return num
                else:
                    dic.add(num)
            return 0
    

          第三种方法是使用 Hash 索引法,刚开始 hash 表为一个空的字典,还是去遍历数组,然后用 hash.get() 去取当前的元素,如果能够在字典里面找到当前的这个数,说明它是重复的,返回即可,否则的话执行 hash[num]=num。同样只需要进行一次遍历,算法的时间复杂度为 0(n)。

    class Solution:
        def findRepeatNumber(self, nums: List[int]) -> int:
            hash = dict()
            for num in nums:
                if not hash.get(num) is None:
                    return num
                else:
                    hash[num] = num
    
  • 相关阅读:
    [后缀数组] Luogu P5028 Annihilate
    [后缀数组] Luogu P3809 后缀排序
    [差分][线段树] Luogu P4243 等差数列
    [线段树] Luogu P4314 COU监控
    [二分][dp凸优化] Luogu P4383 林克卡特树lct
    [树上差分][dfs] Luogu P4652 One-Way Streets
    [dfs][思维] Luogu P3208 矩阵
    [dfs][二进制状压] Luogu P4906 小奔关闹钟
    [容斥] Luogu P5339 唱、跳、rap和篮球
    [dfs][模拟网络流] Luogu P4189 星际旅行
  • 原文地址:https://www.cnblogs.com/chenjin2018/p/14017113.html
Copyright © 2011-2022 走看看