• 剑指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
    
  • 相关阅读:
    简单命令行总结
    [大餐]开发摘记1--我的Fragment通信的框架 | 卖牙膏的芖口钉
    DZNEmptyDataSet的使用
    Java笔记(一)
    mingster.com
    2014新年福利,居然有人将Ext JS 4.1的文档翻译了
    【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三
    【翻译】在Ext JS应用程序中使用自定义图标
    【翻译】Siesta事件记录器入门
    【翻译】使用新的Sencha Cmd 4命令app watch
  • 原文地址:https://www.cnblogs.com/chenjin2018/p/14017113.html
Copyright © 2020-2023  润新知