找數字續;及缺失的數字分析
今日面試題:找數字續
一個陣列A,數字出現的情況,只有以下三種:
1. 一些數字只出現一次
2. 一些數字出現兩次
3. 只有一個數字出現三次
請給出方法,找到出現三次的數字h
缺失的數字分析
原題
給定一個無序的整數陣列,怎麼找到第一個大於0,並且不在此陣列的整數。比如[1,2,0] 返回 3, [3,4,-1,1] 返回 2。最好能O(1)空間和O(n)時間。
分析
首先陣列是無序的,找到第一個大於0且不在陣列中的元素,就是要找到大於0且不在陣列中的最小的整數。要怎麼處理呢?要找到最小的,不妨嘗試從小到 大排序,然後從1開始,查詢是否在陣列中,可以利用二分查詢。這樣整體的時間複雜度是O(nlogn),空間複雜度是O(1)。
離題目的要求,還差一些。如何改進呢?針對排序好的陣列,我們做如下的觀察:
當缺失的數字為1的時候,A[0]<=0, A[1] != 1
當缺失的數字為2的時候,A[0]<=0, A[1] = 1, A[2] != 2
當缺失的數字為3的時候,A[0]<=0, A[1] = 1, A[2] = 2, A[3] != 3
通過上面的觀察,可以發現,其實並不需要整個陣列是有序的,只需要讓陣列中的0
1. 如果A[i]=n,則continue;
2. 如果A[i]=A[A[i]],則continue;
3. 如果0<A[i]<n,那麼可以還原,則swap(A[i], A[A[i]]),然後跳轉到步驟2
然後,陣列中如果存在0
從1開始遍歷,如果A[i]!=i,則i就是要找的數
如果遍歷完,沒有找到,則說明i從[1,n-1],都有A[i]=i,那麼這個時候就看A[0],如果A[0]是n,則返回n+1,如果A[0]不是n,則返回n,即可。
上面演算法的時間複雜度是O(n)麼?有的同學會想,在swap之後,仍然到第2步,可能還會出現交換,所以時間複雜度要高於O(n)。但實際上,swap之後,是會發生再次的交換,但我們可以保證,每一次交換,都會使得一個數字還原,即A[i]=i,再一次交換,會讓一個新的數字還原。 假設陣列中,可以還原的數字個數為k,則需要交換k次,k最多為n-1。這裡要很小心,因為總的交換次數是k,並不是對於每一個元素,都會產生k次交換。 如果是後者,總的時間複雜度就是O(kn)了,但因為總的交換次數是k,所以總的時間複雜度是O(n+k),就是O(n)。
【分析完畢】
本文來自微信:待字閨中,2013-09-11釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 遞推--找數字
- LeetCode:尋找丟失的數字LeetCode
- 如何在1到100的整數陣列上找到缺失的數字陣列
- Python 英文的月份轉數字及數字轉英文Python
- 每日一練(25): 0~n-1中缺失的數字
- 數字孿生的實現方案及可行性分析
- 數字對映:數字孿生技術的應用場景及作用
- 【數字化】數字化轉型是什麼、為什麼、怎麼辦;2018年數字化供應鏈行業及案例分析報告行業
- 資料庫180:連續出現的數字資料庫
- 數字經濟到底是什麼?從社群團購分析數字化
- 談談我的「數字文具盒」 - 數字基建
- 數字化智慧經營方法你找對了嗎?
- 中文數字與阿拉伯數字:數字符號的文化交融符號
- 利用數字智慧經營如何持續盈利?
- 【數字化】IDC首席分析師:這才是數字化轉型的本質!| 重磅必讀
- LeetCode - 1365 - 有多少小於當前數字的數字LeetCode
- 猜數字
- 數字序列
- 數字藏品
- 數字宋朝
- 數字加密加密
- 數字10的黑洞
- 數字5的黑洞
- “為場景找技術”:全球數字化轉型的大同之道
- 多幣種數字錢包開發及區塊鏈數字錢包系統區塊鏈
- 詳解數字簽名的含義及作用
- 數字藏品平臺開發數字藏品系統開發技術架構分析架構
- DMCreator:2020年印度數字營銷分析
- jquery金額數字轉為大寫數字jQuery
- 中文數字阿拉伯數字相互轉換
- 衡量數字發展:事實和數字2020
- 數字格式字串轉數字保留後面0字串
- 數字陣列最值,總和,平均,中位數 未完待續陣列
- 關於數字藏品系統開發程式分析及玩法案例
- 數字化建設博物館的優勢分析
- 數字,小數點正則,一段話提取數字
- 數字銀行:銀行數字化轉型的盡頭
- 數字商品DGE--數字經濟的財富黑馬
- PHP 阿拉伯數字和中文數字的相互轉換PHP