【LeetCode每日一题】丑数2
丑数2
1、题目描述
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例2:
输入:n = 1
输出:1
解释:1 通常被视为丑数。
2、算法描述
思想描述:
采用动态规划的思想,每个数分别与2,3,5相乘,然后把小的数值存入一个数组中,数组中的第n个值就是第n个丑 数
具体实现:
1、使用一个dp数组,存储n个丑数
2、使用3个指针,分别指向,dp数组的第一个内容,他们分别和2,3,5相乘,谁小就在dp数组中存储谁。
步骤描述:
1、定义一个数组为dp
2、a2,a3,a5首先都指向数组的第0个位置(如下图)
3、此时数组中记录了一个丑数,就是1
4、然后比较dp[a2] * 2,dp[a3] * 3,dp[a5] * 5的大小
5、比较除了2小,然后存入其中,然后a2就把指针往后移动一下
6、依次类推,谁存入了dp数组中,那么那个指针就往后移动一下。
3、代码实现
package com.java;
import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Set;
public class Day11_Solution {
public int nthUglyNumber1(int n) {
int[] dp = new int[n+1];
int a2=0,a3=0,a5=0;
dp[0]=1;
for (int i=1;i<n;i++) {
int sum2 = dp[a2] * 2;
int sum3 = dp[a3] * 3;
int sum5 = dp[a5] * 5;
dp[i] = Math.min(Math.min(sum2,sum3),sum5);
if(dp[i] == sum2) {
a2++;
}
if(dp[i] == sum3) {
a3++;
}
if(dp[i] == sum5) {
a5++;
}
}
if (n == 1) {
return 1;
} else {
return dp[n - 1];
}
}
}