陣列中重複的資料
給定乙個整數陣列 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...