• 剑指offer-3.数组中的重复数字


    题目描述

      在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

    解题思路:

      .从头开始扫描数组,当扫描到的数组元素下标为i,首先判断第i位元素的值是否为i, 若是,则接着扫描下一位数字;若不是且第 i 位元素值为m,将m与数组第m位的元素值比较,若相等,则返回该重复数字m,否则将第i与m位的元素交换位置,并按上述步骤继续比较第i位的元素,直到发现第一个重复数字。

    1.输出的是随机的重复数字,不一定是第一个,实测题目要求随机找一个即可

     1 class Solution:
     2     # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
     3     # 函数返回True/False
     4     def duplicate(self, numbers, duplication):
     5         # write code here
     6         index = 0
     7         while index < len(numbers):
     8             if numbers[index] == index:  #只有在元素的值与下标相等时,index才加一,不加一时会对该位置的元素进行新一轮if判断
     9                 index += 1               #通过控制index加一的位置,实现了一轮循环,不过这种计数变量,即index放在if条件中的情况比较少,容易造成死循环
                               #这里是因为有个前提,就是几轮交换过后。if条件总会满足。
    10 elif numbers[index] == numbers[numbers[index]]: 11 duplication[0] = numbers[index] 12 return True 13 else: 14 index_2 = numbers[index] 15 numbers[index],numbers[index_2] = numbers[index_2],numbers[index] 16 return False

    2.同样的思路,代码更简洁,时间复杂度都是o(n)

    class Solution:
        # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
        # 函数返回True/False
        def duplicate(self, numbers, duplication):
            # write code here
             
            for i in range(len(numbers)):
                while/if numbers[i] != i:
                    temp = numbers[numbers[i]]
                    if temp == numbers[i]:
                        duplication[0] = numbers[i]
                        return True
                    else:
                        numbers[numbers[i]] = numbers[i]
                        numbers[i] = temp
                     
                     
            return False

    上面的else条件里

    temp = numbers[i]
    numbers[i] = numbers[numbers[i]]
    numbers[temp]=temp
    这样写是对的

    temp = numbers[i]
    numbers[i] = numbers[numbers[i]]
    numbers[numbers[i]]=temp
    这样就会死循环,因为第三行numbers[numbers[i]]中的numbers[i]已经不是原来位置的numbers[i]了。这个情况之前没遇见过,需要注意。

    3.哈希法,输出的是第一个重复的数字

    class Solution:
        # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
        # 函数返回True/False
        def duplicate(self, numbers,duplication):
            dic = {}
            for num in numbers:
                if not num in dic:
                    dic[num] = 1
                else:
                    dic[num] += 1
            for num in numbers:
                if dic[num] != 1:
                    duplication[0] = num
                    return True
            return False
    

    4.辅助空间

    class Solution:
        # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
        # 函数返回True/False
        def duplicate(self, numbers, duplication):
            # write code here
            if numbers == None or numbers == []:
                return False
            #边界条件
            s  = []
            for i in numbers:
                if i in s:
                    duplication[0] = i
                    return True
                s.append(i)
            return False
    

      

  • 相关阅读:
    Python 虚拟环境 virtualenv
    Python
    开发语言之---Java
    LINUX系统
    关系型数据库之MySQL
    开发语言之---Python
    框架之---Django
    递归/面向过程编程
    迭代器/生成器函数及协程函数的编写和使用
    装饰器的编写及使用
  • 原文地址:https://www.cnblogs.com/wanrongshu/p/12768525.html
Copyright © 2020-2023  润新知