跳至主要內容

丑数

付可心2024年12月22日大约 2 分钟教学文档动态规划-dfs

丑数

题目描述

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

输入格式

输入一个整数n,n表示按从小到大的顺序的第 n 个丑数。 

输出格式

第n个丑数是:...

输入样例

请输入n的值:10

输出样例

10个丑数是12

解题思路

为了找到第n个丑数,我们可以使用动态规划的方法。我们创建一个数组dp,其中dp[i]表示第i个丑数。我们使用三个指针i2、i3和i5分别跟踪当前最小丑数的下一个丑数的位置,它们分别对应乘以2、3和5的操作。初始时,dp[0]被设置为1,因为1是所有丑数的起点,i2、i3和i5都指向0。 每次迭代中,我们计算下一个丑数为min(dp[i2] * 2, dp[i3] * 3, dp[i5] * 5),并更新dp[i]。然后,根据dp[i]的值更新指针i2、i3和i5。重复这个过程,直到dp[n-1]被计算出来,即为第n个丑数。

代码实现

//丑数
import java.util.Scanner;

public class UglyNumber {
    public static int nthUglyNumber(int n) {
        int[] dp = new int[n];
        dp[0] = 1;
        int i2 = 0, i3 = 0, i5 = 0; // 分别指向下一个乘以2、3、5的丑数的位置

        for (int i = 1; i < n; i++) {
            // 计算下一个丑数
            dp[i] = Math.min(Math.min(dp[i2] * 2, dp[i3] * 3), dp[i5] * 5);
            
            // 更新指针
            if (dp[i] == dp[i2] * 2) i2++;
            if (dp[i] == dp[i3] * 3) i3++;
            if (dp[i] == dp[i5] * 5) i5++;
        }

        return dp[n - 1];
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入n的值:");
        int n = scanner.nextInt();
        scanner.close();
        
        int result = nthUglyNumber(n);
        System.out.println("第 " + n + " 个丑数是:" + result);
    }
}
上次编辑于: 2024/12/22 00:07:52
贡献者: crazywood