劍指offer 醜數

2022-09-12 09:18:11 字數 1083 閱讀 5418

題目:

把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

解題思路:

參考程式設計師面試金典p190

每次將第n個醜數a存入列表時,利用其他三個列表q2,q3,q5分別儲存a*2,a*3,a*5.

找出三個列表中最小的元素,將它作為下乙個醜數。

重複上述操作,直至找到第k個醜數。

優化在於:

當找出的醜數a位於q2時,列表q2,q3,q5分別儲存a*2,a*3,a*5.

當找出的醜數a位於q3時,只需列表q3,q5分別儲存a*3,a*5.

(ps:因為a位於q3,故能找到b滿足a=3*b,若將a*2放入q2,即2*3*b放入q2,而2*3*b在q3中已被處理過。這個過程可以簡單的羅列下前幾個元素,就可以看出)

當找出的醜數a位於q5時,只需列表q5儲存a*5.

這個方法算優解了,稍微帶點空間換時間的概率,但空間也在優化。不是無腦的上來直接把a*2,a*3,a*5全放到佇列裡,每次檢索最小值,放到醜數佇列中去。

在網上看到更牛逼的**,沒有輔助佇列,只有三個輔助變數

直接上**,簡單到一點都不想解釋

public

class solution

int array = new

int[index];

int i2=0;

int i3=0;

int i5=0;

array[0]=1;

for(int i =0;i1;i++)

if(temp==array[i3]*3)

if(temp==array[i5]*5)

array[i+1]=temp;

}return

array[index-1];

}public

int getmin(int a,int b,int c)

if(min>c)

return min;

}}

劍指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...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...