L442 陣列中重複的資料

2021-10-06 16:28:12 字數 1289 閱讀 2564

陣列中重複的資料

給定乙個整數陣列 a,其中1 ≤ a[i] ≤ n (n為陣列長度), 其中有些元素出現兩次而其他元素出現一次。

找到所有出現兩次的元素。

你可以不用到任何額外空間並在o(n)時間複雜度內解決這個問題嗎?

示例:輸入:

[4,3,2,7,8,2,3,1]

輸出:[2,3]

1.利用hashmap實現計數的功能

class

solution

list

list =

newarraylist

<

>()

;for

(int num: nums)

}return list;

}}

超時,首先,map遍歷方式不對,這樣超時是必然的

class

solution

list

list =

newarraylist

<

>()

; set

set = map.

keyset()

;//對set遍歷即可

for(integer num : set)

}return list;

}}

2.無窮交換方法

就是把所有的都歸位,剩下沒歸位的就是重複的,要滿足條件,數字在1-n之間

class

solution

}//對於所有不在應有的位置,加入list

for(

int i =

0; i < len; i++)}

return list;

}void

swap

(int

num,

int i,

int j)

}

3.抽屜法,利用負數標記法

遍歷,每乙個數-1作為index下標,對應位置*-1,同時記得最後要修改過來

找到數字i時,將位置i-1處的數字翻轉為負數。

如果位置i-1 上的數字已經為負,則i是出現兩次的數字。

關於負數標記法,常用的為l448,那種方法可以標記沒出現的數字,因此這裡要換一種方法:

class

solution

nums[index]

=-nums[index]

;//先標記

}return list;

}}

LeetCode442 陣列中重複的資料

給定乙個整數陣列 a,其中1 a i n n為陣列長度 其中有些元素出現兩次而其他元素出現一次。找到所有出現兩次的元素。你可以不用到任何額外空間並在o n 時間複雜度內解決這個問題嗎?示例 輸入 4,3,2,7,8,2,3,1 輸出 2,3 思路 使用額外的同nums陣列空間大小相同的陣列為nums...

leetcode442 陣列中重複的資料

給定乙個整數陣列 a,其中1 a i n n為陣列長度 其中有些元素出現兩次而其他元素出現一次。找到所有出現兩次的元素。你可以不用到任何額外空間並在o n 時間複雜度內解決這個問題嗎?示例 輸入 4 3,2 7,8 2,3 1 輸出 2 3 方法一 遍歷到位置i時,將位置i的元素nums i 和位置...

leetcode 442 陣列中重複的資料

給定乙個整數陣列 a,其中1 a i n n為陣列長度 其中有些元素出現兩次而其他元素出現一次。找到所有出現兩次的元素。你可以不用到任何額外空間並在o n 時間複雜度內解決這個問題嗎?示例 輸入 4,3,2,7,8,2,3,1 輸出 2,3 from typing import list class...