1. 程式人生 > >[劍指Offer] 陣列中重複的數字(Python)

[劍指Offer] 陣列中重複的數字(Python)

題目描述

在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。

思路

思路一:用Bool陣列存放flag
思路二:從下標0開始,對每個元素,若numbers[i]不等於i,則交換numbers[i]和numbers[numbers[i]],直至i和numbers[i]相等繼續迴圈,或numbers[i]和numbers[numbers[i]]相等即遇到重複元素返回True。

程式碼

###思路一
# -*- coding:utf-8 -*-
class Solution:
    # 這裡要特別注意~找到任意重複的一個值並賦值到duplication[0]
    # 函式返回True/False
    def duplicate(self, numbers, duplication):
        # write code here
        if numbers is None or len(numbers) == 0:
            return False
        for i in numbers:
            if
i < 0 or i >= len(numbers): return False f_arr = [False] * len(numbers) for i in range(len(numbers)): if f_arr[numbers[i]] == True: duplication[0] = numbers[i] return True f_arr[numbers[i]] = True return
False ###思路二 # -*- coding:utf-8 -*- class Solution: # 這裡要特別注意~找到任意重複的一個值並賦值到duplication[0] # 函式返回True/False def duplicate(self, numbers, duplication): # write code here if numbers is None or len(numbers) == 0: return False for i in numbers: if i < 0 or i >= len(numbers): return False for i in range(len(numbers)): while i != numbers[i]: if numbers[i] == numbers[numbers[i]]: duplication[0] = numbers[i] return True tmp = numbers[numbers[i]] numbers[numbers[i]] = numbers[i] numbers[i] = tmp return False

時空複雜度

思路一:時間複雜度O(n),空間複雜度O(n)
思路二:時間複雜度O(n),空間複雜度O(1)