LenleDaytoy

剑指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

  

 

posted on 2020-04-24 16:50  LenleDaytoy  阅读(145)  评论(0编辑  收藏  举报

导航