陣列中重複數字 leetcode

2021-09-13 11:08:40 字數 3168 閱讀 4690

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

上來這道題的思路就是暴力解決,如何暴力解決這個問題呢。

思路:直接雙重迴圈遍歷,遇到重複的直接輸出。

時間複雜度:最差的可能性就是最後兩個重複,時間複雜度是o(n^2)

def

duplicate

(arr)

: n =

len(arr)

for i in

range

(n):

for j in

range

(i+1

,n):

if arr[i]

== arr[j]

:return a[i]

新的思路:0~n-1正常的排序應該是a[i] = i;因此可以通過交換的方式,將他們都放回屬於自己的位置;

從頭到尾掃瞄陣列a,當掃瞄到下表為i的數字m時,首先比較這個數字m是不是等於i,

如果是,則繼續掃瞄下乙個數字;

如果不是,則判斷它和a[m]是否相等,如果是,則找到了第乙個重複的數字;如果不是,則把a[i]和a[m]交換,即把m方式屬於他中的位置

def

duplicate

(arr)

:for i in

range

(len

(arr)):

while arr[i]

!= i:

if arr[i]

== arr[arr[i]]:

return arr[i]

temp = arr[i]

arr[temp]

,arr[i]

= arr[i]

,arr[temp]

胡思亂想:網上見到的奇怪的做法,思路是隨機生成兩個不同的下邊,隨便猜這兩個數是否相同,如果相同,返回

import random

class

solution

:def

findduplicate

(self, nums: list[

int])-

>

int:

n =len(nums)

while

true

: a = random.randint(

0,n-1)

b = random.randint(

0,n-1)

if a == b:

continue

if nums[a]

== nums[b]

:return nums[a]

思路:建立乙個輔助陣列,然後逐一的把原陣列的每個數字賦值到輔助陣列,如果原陣列中被賦值的數字是m,則把它賦值到輔助陣列中下標為m的位置。

def

findduplicate

(nums)

: temp =[-

1]*len

(nums)

for num in nums:

if temp[num]==-

1:temp[num]

= num

else

:return temp[num]

思路:先對陣列排序,然後遍歷一次排序陣列

def

findduplicate

(nums)

:"""

:type nums: list[int]

:rtype: int

"""nums.sort(

)for i in

range

(len

(nums)-1

):if nums[i]

== nums[i+1]

:return nums[i]

else

:return

-1

def

findduplicate

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""temp =

set(

)for num in nums:

if num not

in temp:

temp.add(num)

else

:return num

思路:類似一種二分做法,先統計陣列在左半邊範圍下出現的次數,如果大於左半邊範圍,說明左半邊範圍中陣列有重複的的,繼續劃分。

def

findduplicate

(self, nums)

:"""

:type nums: list[int]

:rtype: int

"""start =

1 length =

len(nums)

end = length -

1while end>=start:

middle =

((end-start)

>>1)

+start

count = self.countrange(nums,start,middle)

if end == start:

if count >1:

return start

else

:break

if count > middle - start +1:

end = middle

else

: start = middle +

1return-1

defcountrange

(self,nums,start,end)

: count =

0for i in

range

(len

(nums)):

if start<=nums[i]

<=end:

count+=

1return count

陣列中重複數字

題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。返回描述 如果陣列中有重複的數字,函式返回true,否則返回...

leetcode刷題 陣列重複數字

題目描述 在乙個長度為 n 的陣列裡的所有數字都在 0 到 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字 input output 2 includevoid swap int nums,int i,int j int...

leetcode 442 陣列中的重複數字

題目 給定乙個整數陣列 a,其中1 a i n n為陣列長度 其中有些元素出現兩次而其他元素出現一次。找到所有出現兩次的元素。解決 陣列中的元素是1到n,陣列下標是0到n 1,所以可以每個下標i存放i 1。遍歷陣列,把以每個元素為下標的元素加上陣列長度nums.size 上一步,當元素出現兩次的時候...