图解面试题:找出数组中重复的数字?
今天分享的題目來源于 LeetCode 上的劍指 Offer 系列 面試題03. 數組中重復的數字。
題目鏈接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
一、題目描述
找出數組中重復的數字。
在一個長度為 n 的數組 nums 里的所有數字都在 0~n-1 的范圍內。數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。請找出數組中任意一個重復的數字。
示例 1:
輸入: [2,?3,?1,?0,?2,?5,?3] 輸出:2?或?3?限制:
2?<=?n?<=?100000二、題目解析
注意題目描述:一個長度為 n 的數組 nums 里的所有數字都在 0~n-1 的 范圍內,這個 范圍 恰好與數組的下標可以一一對應。
所以我們可以執行某種操作,使索引與值一一對應,即索引 0 的值為 0,索引 1 的值為 1。而一旦某個索引的值不只一個,則找到了重復的數字,也即發生了 哈希沖突。
三、動畫描述
四、圖片描述
五、參考代碼
class?Solution?{public?int?findRepeatNumber(int[]?nums)?{//設索引初始值為?i?=?0int?i?=?0;//遍歷整個數組?nums?while(i?<?nums.length)?{//索引?i?的值為?i,無需執行交換操作,查看下一位if(nums[i]?==?i)?{i++;continue;}//索引?nums[i]?處的值也為?nums[i],即找到一組相同值,返回?nums[i]?即可if(nums[nums[i]]?==?nums[i])?return?nums[i];//執行交換操作,目的是為了使索引與值一一對應,即索引?0?的值為?0,索引?1?的值為?1int?tmp?=?nums[i];nums[i]?=?nums[tmp];nums[tmp]?=?tmp;}//如果遍歷整個數組都沒有找到相同的值,返回?-1return?-1;}
}
六、復雜度分析
時間復雜度
遍歷數組需要 O(N) 時間。
注意參考代碼里面的關鍵字 continue,這表示在 while 的一次循環里面,只有這次循環將 索引(i) 與 索引值(num[i]) 匹配到了,才會執行下一次循環。
在每一次的循環過程中,索引(i) 與 索引值(num[i]) 匹配到后,在后續的循環過程中不會操作它們,所以雖然一開始的循環過程中,執行的交換操作較多,但在后續的循環過程中根本不需要再執行操作了。
根據均攤復雜度分析 ,總的時間復雜度為 ?O(N) ,N 為數組的長度。
空間復雜度
使用常數復雜度的額外空間,為 ?O(1)。
往期推薦多圖證明,Java到底是值傳遞還是引用傳遞?
2020-09-02
面試系列第2篇:回文字符串判斷的3種方法!
2020-08-24
面試系列第1篇:常見面試題和面試套路有哪些?
2020-08-21
關注下方二維碼,收獲更多干貨!
總結
以上是生活随笔為你收集整理的图解面试题:找出数组中重复的数字?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: if快还是switch快?解密switc
- 下一篇: 面试官:你说说互斥锁、自旋锁、读写锁、悲