顛倒乾坤;及忘我之乘積題的分析
今日面試題:顛倒乾坤
在一棵二叉搜尋樹中,有兩個節點顛倒了順序。要求實現一個演算法,在不改變樹結構的前提下,恢復正確的二叉搜尋樹。給出一個空間為O(n)
的實現很容易,那該如何給出一個空間O(1)
的實現呢?
忘我之乘積分析
題目:
給你一個陣列
A[1..n]
,請你在O(n)
的時間裡構造一個新的陣列B[1..n]
,使得B[i]=A[1]*A[2]*...*A[n]/A[i]
。你不能使用除法運算。
分析:
看到題目,不要緊張,要頭腦清晰,看穿面試官的本意,實際上,他是用除法公式,但又要求不用除法來迷惑你。
要求在不使用除法的情況下計算B[i]=A[0]*…*A[n]/A[i]
,簡單變換一下形式,即可得到B[i]=A[0]*…*A[i-1]*A[i+1]*…*A[n]
,一共n-1
次乘法。每一個B[i]
計算一遍,總的時間複雜度為O(n^2)
。不符合題目要求,必須減少乘法的次數。如何減少乘法的次數呢?
繼續分析,通過上面的變換,我們可以得到B[i]
是由兩部分相乘得到的:
A[0]*…*A[i-1]
A[i+1]*…*A[n]
先看第一部分,在計算B[i+1]
的時候,是可以利用B[i]
的第一部分結果的,只需要乘以A[i]
即得到B[i+1]
的第一部分。
第二部分同理,計算完A[i+1]*…*A[n]
,再計算A[i]*A[i+1]*…*A[n]
,只需要乘以A[i]
即可。A[i]*A[i+1]*…*A[n]
是B[i-1]
的第二部分。
由此分析,構建兩個新的陣列:C和D(為了方便解釋,用了兩個陣列),
C[i] = A[0]*…*A[i-1] = C[i-1]*A[i-1]
D[i] = A[i+1]*…*A[n] = D[i+1]*A[i+1}
構建C和D都是O(n)
的時間複雜度(C從前到後遍歷一遍陣列,D從後到前遍歷一邊陣列),然後,B[i] = C[i]*D[i]
也是O(n)
的時間複雜度。整體演算法的時間複雜度是O(n)
。
題目到這解答完畢。
但是面試官的問題還沒有完,他們會繼續問,這個解法的空間是O(n)
的,能夠空間O(1)
的情況下實現麼?
首先看看一個只有5個數的陣列,A[1],A[2],A[3],A[4],A[5]
。
首先從頭到尾遍歷:
B[1] = A[1]
B[2] = B[1]*A[2]
B[3] = B[2]*A[3]
B[4] = B[3]*A[4]
B[5] = B[4], 臨時變數 C=A[5]
然後從尾到頭遍歷:
B[4] = B[3]*C, C=C*A[4]
B[3] = B[2]*C, C=C*A[3]
B[2] = B[1]*C, C=C*A[2]
B[1] = C
通過這個小的例子,我們得到了演算法,然後可以推廣到任意多的元素。這個是面試中常用的技巧。
大家可以自己嘗試把演算法變成程式碼。
本文來自微信:待字閨中,2013-07-05釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。
相關文章
- 顛倒原理題解
- setrendertraget 上下顛倒
- 快排單連結串列;及乾坤大挪移的分析
- 分詞問題;及最大乘積分析分詞
- 演算法題:乘積最大子序列演算法
- 子陣列的乘積陣列
- [程式設計之美][2.2] 不要被階乘嚇倒程式設計
- 怎樣解題|題5.3.21:計算無窮乘積
- 每天一道演算法題:顛倒整數演算法
- UA MATH523A 實分析3 積分理論15 乘積測度H5
- 字串相乘——求字串的乘積字串
- 2013年藍橋杯JavaA組題4(顛倒的價牌)Java
- Java經典例項:按字元顛倒字串Java字元字串
- 關於數位顛倒--C語言描述C語言
- oracle按列求乘積(轉)Oracle
- 【DP】乘積最大子陣列陣列
- 【演算法】用遞迴顛倒一個棧演算法遞迴
- 資料結構與演算法——兩個大整數的乘積問題資料結構演算法
- JZ-051-構建乘積陣列陣列
- PHP 識別相片是否是顛倒的,並且重新擺正相片PHP
- 原始碼分析:CountDownLatch 之倒數計時門栓原始碼CountDownLatch
- 笛卡爾乘積的javascript版實現和應用JavaScript
- 獲取陣列中子串乘積的最大值陣列
- LeetCode-190-顛倒二進位制位LeetCode
- leetcode 152 乘積最大子序列LeetCode
- NOIP2000乘積最大[序列DP]
- 《劍指offer》:[52]構建乘積陣列陣列
- 【Leetcode刷題篇】leetcode152 乘積最大陣列LeetCode陣列
- 最大乘積;及最新版本分析
- 分析:誰能顛覆Facebook
- 卷積運算元的矩陣向量乘積表示&一維離散降質模型卷積矩陣模型
- abc342D 乘積為完全平方數的對數
- javascript顛倒陣列元素順序簡單程式碼例項JavaScript陣列
- 面試程式碼題(vivo)數位之積面試
- 系統堆積和遊戲的核心體驗問題分析遊戲
- 面試題:階乘問題面試題
- 【SQL】“乾坤大挪移”SQL
- dg broker配置的問題及分析