存在重复元素
存在重復元素
力扣(LeetCode)
給定一個整數數組,判斷是否存在重復元素。
如果存在一值在數組中出現至少兩次,函數返回 true 。如果數組中每個元素都不相同,則返回 false 。
示例 1:
輸入: [1,2,3,1]
輸出: true
示例 2:
輸入: [1,2,3,4]
輸出: false
示例 3:
輸入: [1,1,1,3,3,4,3,2,4,2]
輸出: true
一般解法
雙重for循環,依次兩兩匹配是否相等
class Solution(object):def containsDuplicate(self, nums):""":type nums: List[int]:rtype: bool"""# 方法一for i in nums:for j in nums[nums.index(i)+1:len(nums)]:if i == j:return Truereturn False時間復雜度:O(N2)O(N^2)O(N2)
空間復雜度:?
Python集合不重復性,將列表轉換為集合,以長度是否變化來判斷是否有重復數字
# 方法二:Python集合元素不重復性if len(set(nums)) != len(nums):return Truereturn False# 方法三:簡化方法二return len(set(nums)) != len(nums)時間復雜度:O(N)O(N)O(N),len()的時空復雜度都是O(1)O(1)O(1),set()的時間復雜度為O(N)O(N)O(N)
set is actually a hashTable.
a list to set: Iterating over a list is O(N)O(N)O(N), and adding each element to the hash set is O(1)O(1)O(1), so the total operation is O(N)O(N)O(N).
空間復雜度:O(N)O(N)O(N) ?
注意:
力扣官方解法
方法一:排序
在對數字從小到大排序之后,數組的重復元素一定出現在相鄰位置中。因此,我們可以掃描已排序的數組,每次判斷相鄰的兩個元素是否相等,如果相等則說明存在重復的元素。
class Solution {public boolean containsDuplicate(int[] nums) {Arrays.sort(nums);int n = nums.length;for (int i = 0; i < n - 1; i++) {if (nums[i] == nums[i + 1]) {return true;}}return false;} }復雜度分析
時間復雜度:O(NlogNlogNlogN),其中 N 為數組的長度。需要對數組進行排序。Arrays.sort()排序算法的時間復雜度為O(NlogNlogNlogN)
TODO 空間復雜度:O(logNlogNlogN),其中 N 為數組的長度。注意我們在這里應當考慮遞歸調用棧的深度。
java代碼轉python
注意:當nums中只有一個元素如何處理!
方法二:哈希表
對于數組中每個元素,我們將它插入到哈希表中。如果插入一個元素時發現該元素已經存在于哈希表中,則說明存在重復的元素。
HashSet集合:不允許存儲重復的元素,查詢速度快
// java class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> set = new HashSet<Integer>();for (int x : nums) {// if set don't contain x, return true if (!set.add(x)) {return true;}}return false;} }復雜度分析
時間復雜度:O(N),其中 N 為數組的長度。使用哈希集合(HashSet),添加元素的時間復雜度為 O(1),遍歷數組時間復雜度為O(N)
空間復雜度:O(N),其中 N 為數組的長度。算法創建了一個HashSet,占用空間趨向于O(N),其他變量的空間復雜度均為常量
空間復雜度:算法的額外存儲空間
相似題
劍指 Offer 03. 數組中重復的數字
題目額外限定了數組元素的大小范圍,所以有時間復雜度 O(n)O(n),空間復雜度 O(1)O(1) 的做法。
尋找重復數
題目也是額外限定了數組元素的大小范圍(注意限定條件和上題不同!),最優做法是快慢指針。關于快慢指針的練習,還可以看這題快樂一下:202. 快樂數,我精心寫了題解。
刪除排序數組中的重復項
做法也是快慢指針。非常經典的題目,C++ 標準庫的 unique 方法就是 這么實現的。非常值得一刷。
只出現一次的數字
超級經典,我相信絕大多數人已經做過了,沒有做過的速速去會會它。姊妹題:137. 只出現一次的數字 II 和 260. 只出現一次的數字 III。這兩題也是必刷題,刷了以后會對異或有更深入的了解和認識。其中 劍指 Offer 56 - I. 數組中數字出現的次數 是重復題目,我提供了一種 使用二分解決的思路,值得一看哦~
TODO
2021.7.17
參考:
總結
- 上一篇: 如何求解问题--数据结构与算法入门
- 下一篇: 关于安装torch、torchvisio