剑指offer03.数组中重复的数字
劍指offer03.數組中重復的數字
- 題目
- 第一種解法
- 第二種解法
- 第三種解法
- 值得一提的東西
題目
在一個長度為 n 的數組 nums 里的所有數字都在 0~n-1 的范圍內。數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。
示例 1:
輸入: [2, 3, 1, 0, 2, 5, 3]
輸出:2 或 3
第一種解法
一個簡單的暴力方法就是先把輸入的數組排序.從排序的數組中找出重復的數字是一件容易的事情,只需要判斷一個數字的下一個數字是否與本身相等即可
.但是排序一個長度為n的數組需要O(nlogn)的時間
時間復雜度較高,不可取
第二種解法
使用哈希表來解決這個問題.從頭到尾按順序掃描這個數組的每個數字.
每掃描到一個數字的時候.都可以用O(1)的時間來判斷哈希表中是否存在了這個數字. 如果哈希表中沒有這個數字就把他加入進去,下次再判斷時就能找出來
時間復雜度 : O(n)
空間復雜度 : O(n)提高了時間復雜度的前提下是犧牲了一個大小為O(n)的哈希表為代價的
第三種解法
有沒有一種空間上為O(1)的更高效的解法呢?
在一個長度為 n 的數組 nums 里的所有數字都在 0 ~ n-1 的范圍內 。
此說明含義:數組元素的 索引 和 值 是 一對多 的關系。
因此,可遍歷數組并通過交換操作,使元素的 索引 與 值 一一對應(即 nums[i] = i )。因而,就能通過索引映射對應的值,起到與字典等價的作用。
遍歷中,第一次遇到數字 x 時,將其交換至索引 x 處;而當第二次遇到數字 x 時,一定有 nums[x] = x ,此時即可得到一組重復數字。
算法流程:
遍歷數組 nums ,設索引初始值為 i=0 :
若 nums[i]=i : 說明此數字已在對應索引位置,無需交換,因此跳過;
若 nums[nums[i]] = nums[i] : 代表索引 nums[i] 處和索引 ii 處的元素值都為 nums[i] ,即找到一組重復值,返回此值 nums[i] ;
否則: 交換索引為 i 和 nums[i] 的元素值,將此數字交換至對應索引位置。
若遍歷完畢尚未返回,則返回 ?1 。
值得一提的東西
測試用例可能包含無效測試用例
如輸入長度為n的數組中包含(0~n-1)之外的數字
傳入空數組等等
所以我們需要先進行參數的校驗合法性
總結
以上是生活随笔為你收集整理的剑指offer03.数组中重复的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超详细C语言的字符串函数讲解
- 下一篇: 剑指offer06.从尾到头打印链表