題目描述:
把只包含因子2佑颇、3和5的數(shù)稱作丑數(shù)(Ugly Number)。例如6狡耻、8都是丑數(shù)墩剖,但14不是,因?yàn)樗蜃?夷狰。 習(xí)慣上我們把1當(dāng)做是第一個(gè)丑數(shù)岭皂。求按從小到大的順序的第N個(gè)丑數(shù)。
分析:
最開(kāi)始寫了個(gè)從1開(kāi)始判斷自然數(shù)是否是丑數(shù)沼头,直到找到第n個(gè)丑數(shù)為止爷绘。這個(gè)方法顯然耗時(shí)很久。(判斷一個(gè)數(shù)是否是丑數(shù)的思路:如果一個(gè)數(shù)能被2整除进倍,我們把它連續(xù)除以2土至;如果能被3整除,就連續(xù)除以3猾昆;如果能被5整除陶因,就除以5.如果最后我們得到的是1,那么這個(gè)數(shù)就是丑數(shù)垂蜗,否則不是楷扬。)
思路:
只包含因子2,3解幽,5的數(shù)稱為丑數(shù),也就是說(shuō)一個(gè)丑數(shù)肯定是某個(gè)丑數(shù)乘以2,3,5的結(jié)果毅否。用一個(gè)數(shù)組保存已有的丑數(shù),然后計(jì)算后面的丑數(shù)蝇刀。(犧牲空間螟加,以換取時(shí)間)
這種方法的關(guān)鍵在于排序,每個(gè)丑數(shù)都是由別的丑數(shù)乘2/3/5來(lái)的吞琐,所以把所有的丑數(shù)存儲(chǔ)捆探,記住前面的下標(biāo),一旦前面那個(gè)數(shù)的乘2/3/5的丑數(shù)已經(jīng)被后邊使用站粟,就把相應(yīng)的下標(biāo)向前移動(dòng)一個(gè)黍图。
解答:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index<=6) return index;
int i2 =0,i3=0,i5=0;
int[] dp = new int[index];
dp[0]=1;
for(int i=1;i<index;i++) {
dp[i] = Math.min(dp[i2]*2,Math.min(dp[i3]*3,dp[i5]*5));//其中最小的為下一個(gè)丑數(shù)
//把已經(jīng)存在的數(shù),往前移動(dòng)一下
if(dp[i]==dp[i2]*2) i2++;
if(dp[i]==dp[i3]*3) i3++;
if(dp[i]==dp[i5]*5) i5++;
}
return dp[index - 1];
}
}
始終相信奴烙,在線編程題目考的就是你的邏輯思維助被,不可能要你寫上一大堆的代碼,所以代碼一定是越簡(jiǎn)潔越好切诀。