牛客 劍指offer 醜數(Java)

2021-07-25 07:14:13 字數 1013 閱讀 1924

牛客上對應題目:

解析:方法一:

逐個判斷每個整數是不是醜數的解法,直觀但不夠高效:

所謂乙個數m是另乙個數n的因子,是指n能被m整除,也就是說n%m==0.根據醜數的定義,醜數只能被2,3,5整除。也就是說如果乙個數能被2整除,我們把它連續除以2;如果能被3整除,就連續除以3;如果能被5整除,就除以5.如果最後我們得到的是1,那麼這個數就是醜數,否則不是。

方法二:

下乙個醜數一定是已有的醜數乘以2 或者 3 或者 5 得到的。

這種思路的關鍵在於怎樣確定陣列裡面的醜數是排序好的。假設陣列中已經有若干個醜數排好後存放在陣列中,並且把已有的最大的醜數記作m,我們接下來分析如何生成下乙個醜數。該醜數肯定是前面某個醜數乘以2,3,5的結果。所以我們首先考慮把已有的每個醜數乘以2.在乘以2的時候,能得到若干個小於或等於m的結果。由於是按照順序生成的,小於或者等於m肯定已經在陣列中了,我們不需要再次考慮;還會得到若干個大於m的結果,但我們只需要第乙個大於m的結果,因為我們希望醜數是指按從小到大的順序生成的,其他更大的結果以後再說。我們把得到的第乙個乘以2後大於m的結果即為m2.同樣,我們把已有的每乙個醜數乘以3,5,能得到第乙個大於m的結果m3和m5.那麼下乙個醜數應該是m2,m3,m5。這3個數的最小者。

前面分析的時候,提到把已有的每個醜數分別都乘以2,3,5.事實上這不是必須的,因為已有的醜數都是按順序存放在陣列中的。對乘以2而言,肯定存在某乙個醜數t2,排在它之前的每乙個醜數乘以2得到的結果都會小於已有的最大醜數,在它之後的每乙個醜數乘以2得到的結果都會太大。我們只需記下這個醜數的位置,同時每次生成新的醜數的時候,去更新這個t2.對乘以3和5而言,也存在這同樣的t3和t5.

public class solution 

return ugly[index-1];

}public int min(int a,int b,int c)

}

劍指offer 醜數(Java)

題目 我們把只包含因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第1500個醜數。例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做第乙個醜數。思路 直觀思路 從1開始逐一判斷每個整數是否為醜數,直到找到第n個醜數,時間效率太低。因為對於每乙個整數都要計算...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...

劍指Offer 醜數

我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...