我們把只包含質因子2、3和5的數稱作醜數(ugly number)。求按從小到大的順序的第n個醜數。
例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。
判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。
對於第n個醜數,只要從1開始,依次判斷每個數是不是醜數,如果是,則相應的序號加1,直到序號為n,就是我們要的醜數了。但是這種方法時間效率很,通常面試官不會滿意這樣的答案。因此我們需要乙個時間複雜度更低的解法。
換個思路,我們只求醜數,不要去管非醜數。每個醜數必然是由小於它的某個醜數乘以2,3或5得到的,這樣我們把求得的醜數都儲存下來,用之前的醜數分別乘以2,3,5,找出這三這種最小的並且大於當前最大醜數的值,即為下乙個我們要求的醜數。這種方法用空間換時間,時間複雜度為o(n)。
public int getuglynumber(int index)
if(index == 1)
int t2 = 0, t3 = 0, t5 = 0;
int res = new int[index];
res[0] = 1;
for(int i = 1; ireturn res[index-1];
}
劍指Offer對答如流系列 剪繩子
給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...
劍指Offer對答如流系列 包含min函式的棧
定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...
劍指Offer對答如流系列 樹的子結構
輸入兩棵二叉樹a和b,判斷b是不是a的子結構。二叉樹的定義如下 public class treenode 比如下面的 b是a的子結構 看了看 劍指offer 高質量 章節的面試題,發現難度都不高,但是沒有分析好邊界條件亦或是想當然就是容易出錯,細心從來不是說說而已。請重視自己 的規範性 完整性和魯...