在乙個長度為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 上一步,當元素出現兩次的時候...