劍指offer第49題 醜數

會程發表於2020-10-27



問題描述:

我們把只包含質因子 2、3 和 5 的數稱作醜數(Ugly Number)。求按從小到大的順序的第 n 個醜數。

示例:

輸入: n = 10
輸出: 12
解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個醜數。

說明:

  • 1 是醜數。
  • n 不超過1690。


解題思路:

  醜數的遞推性質:醜數只包含因子2,3,5,因此有“醜數=某較小丑數×某因子”(例如:10=5×2)。所以我們可以使用三個因子分別乘以較小的醜數,然後選出最小值即可不斷遞推出第n個醜數。注意需要將對應的下標移動。

參考文章:
醜數



程式碼實現:

public int nthUglyNumber(int n) {
	int[] dp = new int[n];
	int a=0; //表示首個乘以2後大於第i個醜數的位置
	int b=0; //表示首個乘以3後大於第i個醜數的位置
	int c=0; //表示首個乘以5後大於第i個醜數的位置
	dp[0] = 1;  //初始化
	for(int i=1; i<dp.length; i++) {
		int n2 = dp[a]*2;
		int n3 = dp[b]*3;
		int n5 = dp[c]*5;
		dp[i] = Math.min(Math.min(n2, n3), n5);  //選出最小值
		if(dp[i]==n2) a++;
		if(dp[i]==n3) b++;
		if(dp[i]==n5) c++;
	}
	return dp[n-1];
}

提交結果:
在這裡插入圖片描述

相關文章